我想匹配不以字母[aoieu]开头的单词,但正则表达式不起作用

时间:2012-09-17 03:17:56

标签: javascript regex

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

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

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

2 个答案:

答案 0 :(得分:2)

以下是regexr的案例在线视图:http://gskinner.com/RegExr/?325rr

包含

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

你的正则表达式的工作方式与解释锚\b的方式有关。来自this page

  

有三种不同的职位符合词边界:

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

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

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

  6.   

所以你的第一个\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或更多字母。