在正则表达式中否定交替

5

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

(cat|dog)

是否有可能否定这个选择,并匹配任何不是“cat”或“dog”的内容?

如果可以,如何实现?

例如:

假设我正在尝试以近似方式匹配英语中的句子结尾。

也就是说:

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

以下是需要翻译的内容:

以下是一个段落示例:

快速的棕色狐狸跳过懒狗。曾经有一次,桑切斯博士、帕森斯先生和梅森州长去了商店。你好世界。

我在博士、先生和州长处错误地找到了“句子结束符”。

(我使用http://regexpal.com/ 进行测试,如果您想查看上述示例中的情况,请访问该网站)

既然这是错误的,我想说的是:

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

当然,这并不起作用,这就是为什么我寻求帮助的原因。
我还尝试过!/(Dr.|Mr.|Gov.)/和!〜,它们完全没有帮助。
我如何避免匹配"Dr."、"Mr."和"Gov."等内容呢?
提前感谢。
4个回答

2

这是不可能的。通常使用负回顾后断言 (?<!…) 来实现,但 JavaScript 的正则表达式不支持此功能。因此,你需要在匹配后过滤掉不想要的内容。


我不使用JavaScript,而是使用ActionScript。你知道ActionScript是否有这个限制吗? - Joshua
是的。看起来ActionScript正则表达式语法添加的唯一内容是形式为(P<name>...)的命名捕获组。 - Jeremy W. Sherman

0
你可以这样做:
!/(cat|dog)/

编辑:你应该在问题中包含编程语言。它是Actionscript对吧?虽然我不是一个Actionscript编码人员,但据我所知它是这样完成的:

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

斜杠的目的是什么? - Joshua
正斜杠是一些语言(如JavaScript、Perl等)中声明正则表达式的标准方式。 - Sid_M
非常抱歉原帖表述不够清晰,我已经做了一些修改以更明确我的需求。感谢您的耐心等待。 - Joshua

0

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

不幸的是,它将无法按照你的意图工作。/(?!Dr\.)(\.)/仍将返回属于“Dr. Sanches”的句点,因为有第二个分组。正则表达式解析器会说:“是的,这个‘.’不是‘Dr.’”/((?!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 .,.

0
在像Perl/awk这样的语言中,有一个名为!~的运算符。 $string !~ /(cat|dog)/ 在Actionscript中,您可以使用NOT运算符!来否定匹配。请参见此处进行参考。还可以参考此处进行正则表达式风格比较。

这个语法在 AS 中几乎肯定行不通,但是这个概念可以。它运行一个正则表达式,如果匹配成功就返回 true。那么只需要取反这个关系(在 AS 以及其他很多语言中都是用 ! 来实现)。 - Sid_M
很遗憾,在使用正则表达式的语言中,我不能依赖于NOT运算符... 我需要知道如何在正则表达式本身内实现NOT运算符。希望我对问题的编辑能让事情更清楚一些。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接