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

Javascript 我想匹配不以字母[aoieu]开头的单词,但正则表达式不起作用,javascript,regex,Javascript,Regex,我想匹配不以字母[aoieu]开头的单词。返回数组的第一项是“shenmajs”,第三项是“HGHG”。我不明白为什么“)”可以包含该项目。你能帮助我吗?谢谢以下是您在regexr的案例在线视图: 之所以包含“”),是因为regex[^aeiou]表示非a、e、i、o或u的任何字符。其中包括“)” 正则表达式的工作方式与锚\b的解释方式有关。从 有三种不同的位置可以作为单词边界: 如果第一个字符是世界字符,则在字符串中第一个字符之前 如果最后一个字符是单词字符,则在字符串中最后一个字符之后 在字

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

以下是您在regexr的案例在线视图:

之所以包含“”),是因为regex
[^aeiou]
表示非a、e、i、o或u的任何字符。其中包括“)”

正则表达式的工作方式与锚
\b
的解释方式有关。从

有三种不同的位置可以作为单词边界:

  • 如果第一个字符是世界字符,则在字符串中第一个字符之前

  • 如果最后一个字符是单词字符,则在字符串中最后一个字符之后

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


  • 因此,您的第一个
    \b
    在第一个s之前匹配,而不是在首字母“)之前匹配(因为根据规则1,您没有获得初始单词边界)。第一场比赛在冲刺前以抛锚结束。下一场比赛从“(“和s,因为你不能从破折号开始比赛!(试试!)。你的第三场比赛现在将从b和“)”之间的锚开始。由于“)”不在
    [aeiou]
    中,因此允许开始下一场比赛。它也非常有效:它后面紧接着是零个或多个a-z,并带有一个结束词边界

    以下是您在regexr的案例在线视图:

    之所以包含“”),是因为regex
    [^aeiou]
    表示非a、e、i、o或u的任何字符。其中包括“)”

    正则表达式的工作方式与锚
    \b
    的解释方式有关。从

    有三种不同的位置可以作为单词边界:

  • 如果第一个字符是世界字符,则在字符串中第一个字符之前

  • 如果最后一个字符是单词字符,则在字符串中最后一个字符之后

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


  • 因此,您的第一个
    \b
    在第一个s之前匹配,而不是在首字母“)之前匹配(因为根据规则1,您没有获得初始单词边界)。第一场比赛在冲刺前以抛锚结束。下一场比赛从“(“和s,因为你不能从破折号开始比赛!(试试!)。你的第三场比赛现在将从b和“)”之间的锚开始。由于“)”不在
    [aeiou]
    中,因此允许开始下一场比赛。它也非常有效:它后面紧接着是零个或多个a-z,并带有一个结束词边界

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

    尝试:


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

    您的正则表达式选择了
    ”)hghghg“
    ,因为它以非a、o、i、e或u的字符开头,然后后跟0个或多个字母

    尝试:


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

    我知道[^aoieu]是指不是a、o、i、e或u的字符,然后后跟0个或多个字母。但是“\b”表示一个单词的位置,它以“\w”开头,不是吗?关于单词边界问题的详细信息,请参考下面@ray toal的回答。那么,返回的数组如何包含“)hghghg”我同意这不是直观的,我很惊讶边界包含了
    。但我认为这可以归结为,因为您明确地包含了一个“不是a、e、I、o、u的字符”,它会包含在边界内的匹配中(否则只包含/w)。我已经确认(至少在我工作的.NET中)这一点:
    \b\).\b
    将捕获相同的匹配,而
    \b\w*\b
    确实会删除
    我知道[^aoieu]表示一个不是a、o、I、e或u的字符,然后后跟0或更多字母。但是“\b”表示一个单词的位置,它以“\w”开头,不是吗?关于单词边界问题的详细信息,请参考下面@ray toal的回答。那么,返回的数组如何包含“)hghghg”我同意这不是直观的,我很惊讶边界包含了
    。但我认为这可以归结为,因为您明确地包含了一个“不是a、e、I、o、u的字符”,它会包含在边界内的匹配中(否则只包含/w)。我已经确认(至少在我工作的.NET中)这个:
    \b\).\b
    将捕获相同的匹配,而
    \b\w*\b
    确实会删除
    var  str = ")shenmajs-(shenmajsb)hghghg";
    var reg = /\b[^aoieu][a-z]*\b/g;
    str.match(reg);
    
    //returns ["shenmajs", "shenmajsb", ")hghghg"]
    
    var reg = /\b[a-z-[aeiuo]][a-z]*\b/g;