Как прописать регулярное выражения для Regex , чтобы в строке найти два одинаковых слова(не более)?
Я конечно не гуру в регулярных выражения, но я думаю, что подобное через регулярки не находится, а если находится, то в результате будет регулярка-монстр...
На мой взгляд, проще разбить одну большую задачу, на 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();
Привожу ответ только для полноты. Решение, предложенное 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
Демо кода.
Демо регулярного выражения.
\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);
}
}
Вариант с атомарной группировкой:
\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);
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
у меня картинка отображается в picturebox мне нужно её в низ и вверх прокручиватькак это сделать?
Не могу найти связь, с какого момента стал получать описанную ниже ошибкуИспользую 17 студию, начал получать ошибку миграции :
Как определить через php последний день старого года и 1й день любого нового года?