2010-10-19 52 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 .,.