Как вы можете сопоставить слова с более чем одним символом? - PullRequest
3 голосов
/ 05 мая 2009

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

Это не должно совпадать: ttttt, rrrrr, ggggggggggggg

Это должно соответствовать: rttttttt, word, wwwwwwwwwu

Ответы [ 5 ]

6 голосов
/ 05 мая 2009

Следующее выражение поможет.

^(?<FIRST>[a-zA-Z])[a-zA-Z]*?(?!\k<FIRST>)[a-zA-Z]+$
  • захватить первого персонажа в группу FIRST
  • захватить еще несколько персонажей (лениво, чтобы избежать возврата)
  • убедитесь, что следующий символ отличается от FIRST, используя отрицательное прогнозное утверждение
  • захватить все (хотя бы один из-за утверждения) оставшихся символов

Обратите внимание, что достаточно найти символ, отличный от первого, потому что, если ни один символ не отличается от первого, все символы равны.

Вы можете сократить выражение до следующего.

^(\w)\w*?(?!\1)\w+$

Это будет соответствовать еще нескольким символам, кроме [a-zA-Z].

1 голос
/ 05 мая 2009

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

\ Ь (\ ш) \ 1+ \ Ь

чтобы взять все слова одного персонажа и избавиться от них

1 голос
/ 05 мая 2009

Это не использует регулярное выражение, но я верю, что оно сделает то, что вам нужно:

public bool Match(string str)
{
    return string.IsNullOrEmpty(str)
               || str.ToCharArray()
                     .Skip(1)
                     .Any( c => !c.Equals(str[0]) );
}
0 голосов
/ 05 мая 2009
\b\w*?(\w)\1*(?:(?!\1)\w)\w*\b

или

\b(\w)(?!\1*\b)\w*\b

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

(.)(?:(?!\1).)

... потому что вы уже знаете, что каждое слово содержит только слова. С другой стороны, в зависимости от вашего определения слова, вам может понадобиться заменить \w в первых двух регулярных выражениях чем-то более конкретным, например [A-Za-z].

0 голосов
/ 05 мая 2009

Следующий RE сделает противоположность тому, что вы просите: соответствует, где слово состоит из одного и того же символа. Это все еще может быть полезно для вас.

\b(\w)\1*\b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...