AS3 RegEx匹配带有边界类型字符的单词

时间:2009-04-26 03:46:40

标签: regex flex actionscript-3 word-boundary

我想要匹配一个单词列表,当这些单词是真正的单词时,这些单词很容易。例如,对字符串

运行时/\b (pop|push) \b/gsx
  pop弹出门推了一下但是它弹了回来

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

对于包含通常符合单词边界的字符的单词,我需要类似的功能。所以当针对字符串

运行时我需要/\b (reverse!|push) \b/gsx
  

反推!反向!推

只匹配反向!推,但不匹配反向!推。显然这个正则表达式不会这样做所以我需要使用什么而不是\ b来使我的正则表达式足够智能来处理这些时髦的要求?

3 个答案:

答案 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字符之前或之后匹配)。

现在,空格或字符串的开头/结尾作为有效分隔符,并且可以在运行时轻松地从搜索项列表中构建内部表达式。