正则表达式非连续匹配

时间:2017-01-04 06:34:22

标签: regex dart

我试图匹配一个包含2个元音的单词(不必连续),但是我的正则表达式要么不匹配,要么不够。这是最后一次迭代(飞镖)。

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

这里是一个被解析的例子,它应该匹配,一个,肩膀,它们和之后。它只是匹配肩膀和他们的。我理解为什么,因为那是我定义的表达。如何定义表达式以匹配2个元音,无论单词中的位置如何?

  one shoulder their the which over

表达式只需要一次测试一个单词,所以希望这样可以简化事情。

4 个答案:

答案 0 :(得分:3)

您可以使用:

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

答案 1 :(得分:2)

你可以试试这个:

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

Explanation

  1. \S*匹配任何非空格字符(等于[^\r\n\t\f ]
  2. *量词 - 零和无限次之间的匹配
  3. [aeiou]匹配[aeiou]
  4. 下方列表中的单个字符

    输入字符串:one shoulder their the which over

    它将匹配四个字:one shoulder their over

答案 2 :(得分:2)

前两个答案都不正确。

(\S*[aeiouy]\S*){2}可以匹配非空白字符的子字符串,即使它们包含非字字符proof)。

\S*[aeiouy]\S*[aeiouy]\S*有同样的问题(proof)。

正确的解决方案:

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

如果您只想将空格作为单词边界(而不是任何非单词字符),则使用以下正则表达式,其中目标单词位于捕获组\2中。

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

答案 3 :(得分: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