1

我想匹配一个单词列表,当这些单词是真正的单词时,这很容易。例如/\b (pop|push) \b/gsx,当针对字符串运行时

pop推了门,但它又弹回来了

将匹配单词 pop 和 push 但不弹出。

对于包含通常符合单词边界的字符的单词,我需要类似的功能。所以我需要/\b (reverse!|push) \b/gsx在对着绳子跑的时候

反向推!反向!推

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

4

3 回答 3

2

在单词的末尾,\b 表示“前一个字符是单词字符,而下一个字符(如果有下一个字符)不是单词字符。您要删除第一个条件,因为可能存在非-“单词”末尾的单词字符。这会给您留下否定的前瞻:

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

我很确定 AS3 正则表达式支持前瞻。

于 2009-04-26T06:30:30.513 回答
0

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

  • /\breverse!(?:\s|$)/逆转!通过它自己
  • /\bpush\b/自己推
  • /\breverse!push\b/一起
  • /\bpushreverse!(?:\s|$)/这是可能的情况

您的第二个问题是 a\b在 a 之后不匹配,"!"因为它不是 a \w。以下是Perl 5 的内容\b,您可能需要查阅您的文档以查看他们是否同意:

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

因此,您需要的正则表达式类似于

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

我省略了,/s因为这个正则表达式中没有句点,所以将其视为单行是没有意义的。如果/s不意味着将其视为引擎中的单行,则您可能应该将其添加回来。此外,您应该阅读您的引擎如何处理交替。我知道在 Perl 5 中要获得正确的行为,您必须以这种方式排列项目(否则反向!总是会胜过反向!推)。

于 2009-04-26T04:07:00.420 回答
0

您可以将 \b 替换为等效但不那么严格的东西:

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

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

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

于 2009-04-26T07:56:34.160 回答