AS3 RegExp 用于匹配单词及其中的边界类型字符
-
16-09-2019 - |
题
我想要匹配一个单词列表,当这些单词是真正的单词时,这很容易。例如 /\b (pop|push) \b/gsx
当撞到绳子时
砰砰地推了一下门,但门又弹回来了
将匹配单词 pop 和 push 但不匹配 poped。
对于包含通常符合单词边界的字符的单词,我需要类似的功能。所以我需要 /\b (reverse!|push) \b/gsx
当撞到绳子时
逆推!反向!推
只匹配反向!和push 但不匹配reverse!push。显然这个正则表达式不会这样做,那么我需要使用什么来代替 \b 来使我的正则表达式足够智能来处理这些时髦的要求?
解决方案
在一个单词的结尾,\ B表示“前面的字符是一个字字符,一个字符(如果有下一个字符),不发一言的性格。你要删除的第一个条件,因为有可能是一个非单词字符的“字”这使得你具有负先行的末尾:
/\b (reverse!|push) (?!\w)/gx
我敢肯定AS3正则表达式的支持先行。
其他提示
您的第一个问题是您的轮换中需要三个(可能是四个)案例,而不是两个。
/\breverse!(?:\s|$)/
撤销!通过它自己/\bpush\b/
自己推动/\breverse!push\b/
一起/\bpushreverse!(?:\s|$)/
这是可能的情况
你的第二个问题是 \b
之后将不匹配 "!"
因为它不是一个 \w
. 。这是什么 Perl 5 不得不说的 \b
, ,您可能需要咨询您的文档以查看他们是否同意:
单词边界(“\b”)是两个字符之间的一个点,其一侧有“\w”,另一侧有“\W”(无论顺序),将虚数字符计算在内字符串的开头和结尾匹配“\W”。(在字符类中,“\b”表示退格而不是单词边界,就像它在任何双引号字符串中通常所做的那样。)
所以,你需要的正则表达式是这样的
/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;
我遗漏了 /s
因为这个正则表达式中没有句点,所以视为单行是没有意义的。如果 /s
并不意味着将其视为引擎中的一行,您可能应该将其添加回来。另外,您应该了解您的引擎如何处理交替。我知道在 Perl 5 中要获得正确的行为,您必须以这种方式排列项目(否则相反!总是会战胜reverse!push)。
可以通过等效的东西替代\ B,但不太严格的:
/(?<=\s|^)(reverse!|push)(?=\s|$)/g
此方式\b
的(即它可以实际\w
字字符之前或之后仅匹配)的限制因素被去除。
现在空格或字符串功能为有效分离器的开始/结束,并且内表达可以在运行时可以容易地建立,从例如搜索术语的列表。