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