Регулярное выражение для Regex

92
17 декабря 2021, 15:50

Как прописать регулярное выражения для Regex , чтобы в строке найти два одинаковых слова(не более)?

Answer 1

Я конечно не гуру в регулярных выражения, но я думаю, что подобное через регулярки не находится, а если находится, то в результате будет регулярка-монстр...

На мой взгляд, проще разбить одну большую задачу, на 2 подзадачи:

Сначала разделим предложение на слова \w+, а затем полученную коллекцию сгруппируем и отфильтруем, что бы получить результат:

var res = Regex.Split("A A B B C C C", @"\W+").
GroupBy(r => r, r => r, (key, group) => new {Key=key,Count=group.Count()} ).
Where(r => r.Count==2).ToList();

Answer 2

Привожу ответ только для полноты. Решение, предложенное iluxa1810, безусловно более оптимально.

using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester {
    public class Program {
        public static void Main(string[] args) {
            Regex re = new Regex(@"\b(\p{L}+)\b" +        // сохранить слово в \1.
                                 @"(?<!\b\1\b.*\b\1\b)" + // проверить, что до начала строки слово встречается только один раз.
                                 @"(?!(.*?\b\1\b){2})" +  // проверить, что до конца строки слово не повторяется больше одного раза.
                                 @"(?=.*?\b\1\b)",        // проверить, что до конца строки слово встречается только один раз.
                                 RegexOptions.Compiled);
            string s = "A B C C B C A D ABCD";
            string pairs = string.Join(", ", from Match m in re.Matches(s) select m.Groups[1].Value);
            Console.WriteLine(pairs);
        }
    }
}

Результат:

A, B

Демо кода.
Демо регулярного выражения.

Answer 3
\b(\w+)\b(?=.*\b\1\b)(?!.*\b\1\b.*\b\1\b)(?<!\b\1\b.+)

https://ideone.com/DnBUeA

using System;
using System.Text.RegularExpressions;
public class Test
{
  public static void Main()
  {
    string s = "A B C C B C A D ABCD";
    foreach (Match m in Regex.Matches(s, @"\b(\w+)\b(?=.*\b\1\b)(?!.*\b\1\b.*\b\1\b)(?<!\b\1\b.+)", RegexOptions.IgnoreCase))
      Console.WriteLine(m.Value);
  }
}
Answer 4

Вариант с атомарной группировкой:

\b(\w+)\b(?=(?>.*?\b\1\b)(?!.*\b\1\b))(?<!\b\1\b.+)

https://ideone.com/qznDtA

using System;
using System.Text.RegularExpressions;
public class Test
{
  public static void Main()
  {
    string s = "A B C C B C A D ABCD";
    foreach (Match m in Regex.Matches(s, @"\b(\w+)\b(?=(?>.*?\b\1\b)(?!.*\b\1\b))(?<!\b\1\b.+)", RegexOptions.IgnoreCase))
      Console.WriteLine(m.Value);
  }
}
READ ALSO
как прокручивать картинку?

как прокручивать картинку?

у меня картинка отображается в picturebox мне нужно её в низ и вверх прокручиватькак это сделать?

213
Ошибка миграции в проекте WinForms .NET 4.6

Ошибка миграции в проекте WinForms .NET 4.6

Не могу найти связь, с какого момента стал получать описанную ниже ошибкуИспользую 17 студию, начал получать ошибку миграции :

71
Что делает данный скрипт php

Что делает данный скрипт php

Скажите, пожалуйста, что делает данный код php

236
Как определить первый день нового года?

Как определить первый день нового года?

Как определить через php последний день старого года и 1й день любого нового года?

158