代码之家  ›  专栏  ›  技术社区  ›  DL Redden

as3 regexp以匹配其中包含boundry类型字符的单词

  •  1
  • DL Redden  · 技术社区  · 16 年前

    我想匹配一个单词列表,当这些单词是真正的单词时,这个列表就足够简单了。例如 /\b (pop|push) \b/gsx 当与绳子相撞时

    砰的一声把门推开,但门又弹了回来。

    将匹配单词pop和push,但不匹配popped。

    我需要类似的功能,用于包含通常可以作为单词边界的字符的单词。所以我需要 /\b (reverse!|push) \b/gsx 当与绳子相撞时

    推倒!倒车!推

    只匹配反向!推,但不匹配反向!推。显然,这个regex不会这样做,所以我需要用什么来代替\b来使我的regex足够智能来处理这些时髦的需求?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Alan Moore Chris Ballance    16 年前

    在单词末尾,b表示“前一个字符是单词字符,下一个字符(如果有下一个字符)不是单词字符。”您希望删除第一个条件,因为“单词”的结尾可能有一个非单词字符。这让你有一种消极的预感:

    /\b (reverse!|push) (?!\w)/gx
    

    我很确定3个regex支持lookahead。

        2
  •  0
  •   Chas. Owens    16 年前

    你的第一个问题是你需要三个(可能是四个)案例交替出现,而不是两个。

    • /\breverse!(?:\s|$)/ 倒车!独自一人
    • /\bpush\b/ 自我推动
    • /\breverse!push\b/ 在一起
    • /\bpushreverse!(?:\s|$)/ 这是可能的情况

    你的第二个问题是 \b A之后就不匹配了 "!" 因为它不是 \w . 这里是什么 Perl 5 has to say about \b ,您可能想咨询您的文档,看看他们是否同意:

    单词边界(“\b”)是两个字符之间的一个点,其中一个字符的一边有一个“w”,另一个字符的另一边有一个“w”(按任意顺序),将字符串开头和结尾的虚拟字符计数为匹配的“w”。(在字符类中,“b”表示退格而不是字边界,就像它通常在任何双引号字符串中那样。)

    所以,你需要的正则表达式是

    / \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;
    

    我漏掉了 /s 因为此regex中没有句点,所以将其视为单行毫无意义。如果 s 并不意味着把它当作发动机中的一条线来处理,你应该把它加回去。另外,您应该阅读一下您的引擎如何处理交替。我知道在Perl5中,为了获得正确的行为,您必须以这种方式安排项目(否则将是反向的)。会永远战胜逆转!推)。

        3
  •  0
  •   Tomalak    16 年前

    您可以用等效但不太严格的内容替换\b:

    /(?<=\s|^)(reverse!|push)(?=\s|$)/g
    

    这样的限制因素 \b (它只能在实际值之前或之后匹配 \w 删除字符)。

    现在,空白或者字符串函数的开始/结束作为有效的分隔符,内部表达式可以在运行时从搜索词列表中轻松构建。