var str = ")shenmajs-(shenmajsb)hghghg";
var reg = /\b[^aoieu][a-z]*\b/g;
str.match(reg);
//returns ["shenmajs", "shenmajsb", ")hghghg"]
我想匹配不以字母[aoieu]开头的单词。返回数组的第一项是“shenmajs”,但第三项是“)hghghg”。我不明白为什么“)”可以包含该项目。你能帮助我吗?谢谢
答案 0 :(得分:2)
以下是regexr的案例在线视图:http://gskinner.com/RegExr/?325rr
包含“)”因为正则表达式[^aeiou]
表示任何字符不是a,e,i,o或u。这包括“)”。
你的正则表达式的工作方式与解释锚\b
的方式有关。来自this page
有三种不同的职位符合词边界:
在字符串中的第一个字符之前,如果第一个字符是一个字符。
在字符串中的最后一个字符后,如果最后一个字符是单词字符。
- 醇>
字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
所以你的第一个\b
在第一个s之前匹配,不是在初始“)之前(因为你没有得到规则1的初始单词边界)。第一场比赛以破折号前的锚点结束。下一场比赛从“(”和“s”之间的锚点开始,因为你不能在破折号处开始比赛!(试试吧!)。你的第三场比赛现在将从b和“之间的锚点开始” )”。由于“{”在<{1}}中不,因此可以开始下一场比赛。而且效果也很好:紧接着是零个或多个a-z,带有结束词边界!
答案 1 :(得分:1)
你的正则表达式正在挑选")hghghg"
因为它以不是a,o,i,e或u的字符开头,然后是0或更多字母。
尝试:
var reg = /\b[a-z-[aeiuo]][a-z]*\b/g;
也就是说,所有单词都以不是元音(a,e,i,o或u)的字母开头,然后是0或更多字母。