2017-01-04 5 views
4

Я пытаюсь совместить слово, в котором есть 2 гласных (не обязательно последовательно), но регулярное выражение, которое я выбрал, либо не соответствует ни одному, либо недостаточно. Это последняя итерация (дротик).regex nonconsecutive match

final vowelRegex = new RegExp(r'[aeiouy]{2}'); 

Ниже приведен пример примерного выражения, которое должно совпадать, одно, плечо, их и многое другое. Это только совпадение плеча и их. Я понимаю, почему, потому что это выражение, которое я определил. Как определить выражение в соответствии с двумя гласными, независимо от позиции в слове?

one shoulder their the which over 

Выражение нужно тестировать только по одному слову, так что, надеюсь, это упростит ситуацию.

+0

, что происходит, когда вы используете [aeiouy] {0} –

ответ

2

Оба предыдущих двух ответов неверны.

(\S*[aeiouy]\S*){2} может соответствовать подстроки непробельных символов , даже если они содержат символы, не слово (proof). (proof).


Правильное решение:

\b([^\Waeiou]*[aeiou]){2}\w*\b 

И если вы хотите только пробельные считать, как граница слова (а не любой не слова характера), а затем использовать следующее регулярное выражение, где цель слово находится в группе захвата \2.

(\s|^)(([^\Waeiou]*[aeiou]){2}\w*)(\s|$) 
+0

Не пытайтесь объяснить нижний план? – Travis

+0

AFAIK Последний пример не работает в браузере (downvote был не мной) –

+0

@ GünterZöchbauer доказал, что он работает [здесь] (https://regex101.com/r/SqjN8T/8) – Travis

2

Вы можете попробовать это:

\S*[aeiouy]\S*[aeiouy]\S* 

Explanation

  1. \S* соответствует любому символу (равный [^\r\n\t\f ])
  2. * квантор - Матчи между нулем и неограниченное количество раз
  3. [aeiou] Сопоставьте один символ, присутствующий в списке ниже [aeiou]

Для ввода строки: one shoulder their the which over

он будет соответствовать четыре слова: one shoulder their over

+0

Вопрос был о словах с гласными 2 , –

+0

он делает это, не так ли? –

+1

'плечо' имеет 3 гласных. –

3

Вы можете использовать:

new RegExp(r'(\w*[aeiouy]\w*){2}'); 
2

Я хотел бы сделать:

\b(?:\w*[aeiouy]+\w*){2,}\b 

Объяснение:

\b   : word boundary 
    (?:   : start non-capture group 
    \w*  : 0 or more word characters 
    [aeiouy]+ : 1 or more vowels 
    \w*  : 0 or more word characters 
){2,}  : end group repeated at least twice 
\b   : word boundary