我想要匹配一个单词列表,当这些单词是真正的单词时,这很容易。例如 /\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字字符之前或之后仅匹配)的限制因素被去除。

现在空格或字符串功能为有效分离器的开始/结束,并且内表达可以在运行时可以容易地建立,从例如搜索术语的列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top