2010-10-19 73 views
3

我可以在正则表达式中使用的“交替”相匹配的“猫”和“狗”正是如此的任何次数:否定交替正则表达式

(cat|dog) 

是否有可能否定这一交替,搭配什么那不是“猫”还是“狗”?

如果是这样,怎么样?

例如:

比方说,我想用英语匹配句末,以近似的方式。

即:

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

有以下段落:

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

我错误地发现“句尾”的博士先生和州长

(我的情况下,使用http://regexpal.com/你想看到什么,我用上面的例子中看到测试)

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

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

当然,这是行不通的,这就是为什么我寻求帮助。

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

我该如何避免“博士”,“先生”和“Gov.”等?

在此先感谢。

回答

2

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

+0

我没有使用Javascript,但使用ActionScript。你知道如果Actionscript分享这个限制? – Joshua 2010-10-19 04:28:57

+0

它的确如此。它看起来像是[ActionScript正则表达式语法]添加的唯一东西(http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000112 .html)被命名为'(P ...)'形式的捕获组。 – 2010-10-19 04:48:54

0

在如Perl/awk语句,还有的!~操作

$string !~ /(cat|dog)/

在ActionScript中,你可以使用NOT操作!否定匹配。请参阅here以供参考。对正则表达式的口味比较也here

+0

这个工作在Actionscript中吗? – Joshua 2010-10-19 02:46:41

+0

该语法几乎肯定不会在AS中工作,但概念确实如此。它运行一个正则表达式,如果匹配则返回true。那么就没有那种关系(这是在AS中以及其他许多语言中完成的)。 – 2010-10-19 02:52:57

+0

不幸的是,我不能依赖于使用正则表达式的语言中的NOT运算符......我需要知道如何在正则表达式本身之内完成NOT运算符。我希望我对这个问题的编辑更清楚。 – Joshua 2010-10-19 03:23:05

0

你可以这样做:

!/(cat|dog)/ 

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

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

斜线的用途是什么? – Joshua 2010-10-19 02:46:13

+0

正斜杠是一种标准的方式在某些语言中声明正则表达式(javascript,perl,可能还有其他语言)。 – 2010-10-19 02:51:16

+0

@Joshua,我已经编辑了我的答案,请看。 – Ruel 2010-10-19 03:02:08

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 .,.