0
var  str = ")shenmajs-(shenmajsb)hghghg";
var reg = /\b[^aoieu][a-z]*\b/g;
str.match(reg);

//returns ["shenmajs", "shenmajsb", ")hghghg"]

我想匹配不以字母 [aoieu] 开头的单词。返回数组的第一项是“shenmajs”,但第三项是“)hghghg”。我不明白为什么“)”可以包含该项目。你能帮助我吗?谢谢

4

2 回答 2

2

这是您在 regexr 上的案例的在线视图:http://gskinner.com/RegExr/? 325rr

包含“)”是因为正则表达式[^aeiou]表示任何不是 a、e、i、o 或 u 的字符。这包括“)”。

您的正则表达式的工作方式与\b解释锚的方式有关。从这个页面

有资格作为单词边界的三个不同位置:

  1. 在字符串中的第一个字符之前,如果第一个字符是一个单词字符。

  2. 在字符串的最后一个字符之后,如果最后一个字符是单词字符。

  3. 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

所以你的第一个\b匹配是在第一个 s 之前,而不是在最初的 ")" 之前(因为你没有按照规则 1 获得初始单词边界)。第一场比赛以破折号前的锚点结束。下一场比赛从 "(" 和 s 之间的锚点开始,因为你无法从破折号开始匹配!(试试看!)。你的第三场比赛现在将从 b 和 " 之间的锚点开始)”。由于没有“)” ,[aeiou]因此可以开始您的下一场比赛。而且它的效果也很好:紧随其后的是零个或多个带有结尾单词边界的 az!

于 2012-09-17T03:20:41.997 回答
1

您的正则表达式正在选择")hghghg",因为它以一个不是 a、o、i、e 或 u 的字符开头,然后是 0 个或多个字母。

尝试:

var reg = /\b[a-z-[aeiuo]][a-z]*\b/g;

也就是说,所有单词都以非元音字母(a、e、i、o 或 u)开头,然后是 0 个或多个字母。

于 2012-09-17T03:31:45.293 回答