4

我可以在正则表达式中使用“交替”来匹配任何出现的“猫”或“狗”:

(cat|dog)

是否有可能否定这种交替,并匹配任何不是“猫”或“狗”的东西?

如果是这样,怎么做?

例如:

假设我正在尝试以近似的方式匹配英语中的 END OF SENTENCE。

以机智:

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

与以下段落:

敏捷的棕色狐狸跳过了懒狗。曾几何时,桑切斯博士、帕森斯先生和梅森州长去了商店。你好世界。

我在 Dr.、Mr. 和 Gov 错误地找到了“句末”。

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

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

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

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

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

如何避免匹配“Dr.”、“Mr.” 和“政府”等?

提前致谢。

4

4 回答 4

2

这不可能。您通常会使用否定的lookbehind 来执行此操作(?<!…),但JavaScript 的正则表达式不支持此操作。相反,您必须在事后过滤匹配项以丢弃您不想要的匹配项。

于 2010-10-19T03:57:32.387 回答
0

(?!NotThisStuff) 是您想要的,也称为负前瞻组。

不幸的是,它不会按您的意愿工作。/(?!Dr\.)(\.)/由于第二个分组,仍将返回属于“Dr. Sanches”的句点。正则表达式解析器会对自己说:“是的,这个'。' 不是 'Dr.'" /((?!Dr).)/也不起作用,尽管我相信它应该起作用。

更重要的是,无论如何,你最终会浏览所有的句子“ends”。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 .,.
于 2010-10-20T00:00:21.763 回答
0

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

$string !~ /(cat|dog)/

在 Actionscript 中,您可以只使用 NOT 运算符!来否定匹配。请参阅此处以供参考。也在这里进行正则表达式风味比较

于 2010-10-19T02:40:27.227 回答
0

你可以这样做:

!/(cat|dog)/

编辑:您应该在问题中包含编程语言。它的 Actionscript 对吗?我不是动作脚本编码器,但 AFAIK 是这样完成的:

var pattern2:RegExp = !/(cat|dog)/;
于 2010-10-19T02:42:50.567 回答