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

AS3 RegExp,用于匹配包含边界类型字符的单词

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

    我想匹配一个单词列表,当这些单词是真正的单词时,这很容易。例如 /\b (pop|push) \b/gsx 当碰到绳子时

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

    /\b (reverse!|push) \b/gsx 当碰到绳子时

    只匹配反向!并推动但不匹配反向!推。显然,这个正则表达式不会做到这一点,那么我需要使用什么来代替\b,使我的正则表达式足够智能,以处理这些时髦的需求呢?

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

    在单词末尾,\b表示“前一个字符是单词字符,下一个字符(如果有下一个单词)不是单词字符。你想放弃第一个条件,因为“单词”末尾可能有一个非单词字符。这会给你留下一个负面的展望:

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

        2
  •  0
  •   Chas. Owens    17 年前

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

    • /\breverse!(?:\s|$)/ 反向!独自
    • /\bpush\b/
    • /\breverse!push\b/ 一起
    • /\bpushreverse!(?:\s|$)/ 这是可能的情况

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

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

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

    我遗漏了 /s 因为这个正则表达式中没有句点,所以将其视为单行是没有意义的。如果 s 这并不意味着把它当作引擎中的一条线,你可能应该把它加回去。此外,你应该深入了解你的引擎是如何处理交替的。我知道在Perl 5中,要获得正确的行为,您必须以这种方式排列项目(否则reverse!总是会战胜reverse?push)。

        3
  •  0
  •   Tomalak    17 年前

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

    这种方式的限制因素 \b (它只能在实际比赛之前或之后进行匹配 \w 单词字符)被删除。

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