在正则表达式中否定交替

时间:2010-10-19 02:35:45

标签: regex actionscript-3 regex-negation

我可以在正则表达式中使用“Alternation”来匹配任何出现的“cat”或“dog”:

(cat|dog)

是否有可能取消此次更改,并匹配任何非“cat”或“dog”的内容?

若然,怎么样?

例如:

假设我试图用英语大致匹配END OF SENTENCE。

To Wit:

(\.)(\s+[A-Z][^.]|\s*?$)

使用以下段落:

快速的棕色狐狸跳过懒狗。曾几何时,桑奇博士,帕森斯先生和州长梅森都去了商店。 Hello World。

我错误地在博士,先生和州长那里找到了“句尾”

(我正在使用http://regexpal.com/进行测试,以防您想看到我在上面的示例中看到的内容)

由于这是不正确的,我想说的是:

!(Dr\.|Mr\.|Gov\.)(\.)(\s+[A-Z][^.]|\s*?$)

当然,这不起作用,这就是我寻求帮助的原因。

我也试过了!/(Dr. | Mr. | Gov。)/,和~~这些都没有任何帮助。

如何避免“博士”,“先生”的比赛和“政府”等?

提前致谢。

4 个答案:

答案 0 :(得分:2)

这是不可能的。你通常会使用负面的lookbehind (?<!…)来做这件事,但是JavaScript的正则表达式并不支持这一点。相反,您必须在事后过滤匹配以丢弃您不想要的匹配。

答案 1 :(得分:0)

在像Perl / awk这样的语言中,有!~运算符

$string !~ /(cat|dog)/

在Actionscript中,您可以使用NOT运算符!来否定匹配。请参阅here以供参考。同样here用于正则表达式风格比较

答案 2 :(得分:0)

你可以这样做:

!/(cat|dog)/

编辑:你应该在你的问题中包含编程语言。它的Actionscript对吗?我不是一个动作编码器,但AFAIK就是这样做的:

var pattern2:RegExp = !/(cat|dog)/;

答案 3 :(得分:0)

(?!NotThisStuff)就是你想要的,否则称为负前瞻组。

不幸的是,它不会像你想要的那样起作用。由于第二次分组, /(?!Dr \。)(\。)/ 仍将返回属于“Dr. Sanches”的句点。正则表达式解析器会对自己说,“是的,这个'。'不是'博士'“ /((?!Dr)。)/ 也不会有用,不过我认为应该这样做。

而且,无论如何,你最终会查看所有句子“结束”。 Actionscript没有“全部匹配”,只有匹配优先。您必须设置全局标志(或将g添加到正则表达式的末尾)并调用exec,直到结果对象为空。

var string = 'The quick brown fox jumps over the lazy dog. Once upon a time Dr. Sanches, Mr. Parsons and Gov. Mason went to the store. Hello World.';

var regx:RegExp = /(?!Dr\.)(\.)/g;
var result:Object = regx.exec(string);

for (var i = 0; i < 10; i++) { // paranoia
  if (result == null || result.index == 0) break; // again: paranoia
  trace(result.index, result);
  result = regx.exec(string);
}

// trace results:    
//43 .,.
//64 .,.
//77 .,.
//94 .,.
//119 .,.
//132 .,.