我可以在正则表达式中使用“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。)/,和~~这些都没有任何帮助。
如何避免“博士”,“先生”的比赛和“政府”等?
提前致谢。
答案 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 .,.