我想要匹配一个单词列表,当这些单词是真正的单词时,这些单词很容易。例如,对字符串
运行时/\b (pop|push) \b/gsx
pop弹出门推了一下但是它弹了回来
将匹配单词pop和push但不会弹出。
对于包含通常符合单词边界的字符的单词,我需要类似的功能。所以当针对字符串
运行时我需要/\b (reverse!|push) \b/gsx
反推!反向!推
只匹配反向!推,但不匹配反向!推。显然这个正则表达式不会这样做所以我需要使用什么而不是\ b来使我的正则表达式足够智能来处理这些时髦的要求?
答案 0 :(得分:2)
在一个单词的末尾,\ b表示“前一个字符是单词字符,下一个字符(如果有下一个字符)不是单词字符。你想放弃第一个条件,因为可能在“单词”的末尾是一个非单词字符。这会让你有一个负向前瞻:
/\b (reverse!|push) (?!\w)/gx
我非常确定AS3正则表达式支持前瞻。
答案 1 :(得分:0)
你的第一个问题是你的交替需要三个(可能是四个),而不是两个。
/\breverse!(?:\s|$)/
反向!本身/\bpush\b/
自行推送/\breverse!push\b/
在一起/\bpushreverse!(?:\s|$)/
这是可能的情况您的第二个问题是\b
后"!"
不匹配,因为它不是\w
。以下是Perl 5 has to say about \b
,您可能需要咨询您的文档,看看他们是否同意:
单词边界(“\ b”)是两个字符之间的一个点,在它的一边有一个“\ w”,另一边有一个“\ W”(按任意顺序),字符串开头和结尾的虚构字符与“\ W”匹配。 (在字符类中,“\ b”表示退格而不是单词边界,就像通常在任何双引号字符串中一样。)
所以,你需要的正则表达式就像是
/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;
我遗漏了/s
,因为此正则表达式中没有句点,所以单行处理毫无意义。如果/s
并不意味着在引擎中将其视为单行,则应该将其添加回来。此外,您应该了解引擎如何处理交替。我知道在Perl 5中为了获得正确的行为,你必须以这种方式安排项目(否则反向!总是胜过反向!推送)。
答案 2 :(得分:0)
你可以用等价的东西替换\ b,但不太严格:
/(?<=\s|^)(reverse!|push)(?=\s|$)/g
这样就消除了\b
的限制因素(它只能在实际的\w
字符之前或之后匹配)。
现在,空格或字符串的开头/结尾作为有效分隔符,并且可以在运行时轻松地从搜索项列表中构建内部表达式。