2009-04-26 25 views
1

我想匹配的單詞列表是很容易當這些話是真的話。例如/\b (pop|push) \b/gsx當對字符串AS3正則表達式來匹配boundry類型的字符的話在他們

流行給了門一推跑了,但它趕回

將匹配詞流行和推動,但沒有彈出。

我需要爲包含通常有資格作爲單詞邊界字符的話類似的功能。所以我需要/\b (reverse!|push) \b/gsx當對陣字符串運行時

推反了!逆轉!推

到只匹配逆轉!推動但不匹配反向!推。很明顯,這個正則表達式不會這樣做,所以我需要使用什麼來代替\ b來使我的正則表達式足夠聰明來處理這些時髦的需求?

回答

2

在詞的結尾,\ B表示「前面的字符是一個字字符,一個字符(如果有下一個字符),不發一言的性格。你要刪除的第一個條件,因爲有可能是「單詞」末尾的非單詞字符。這讓你看起來很負面:

/\b (reverse!|push) (?!\w)/gx 

我很確定AS3正則表達式支持lookahead。

+0

除了使用(?!\ w)作爲尾部的\ b替換之外,我還使用(?<!\ w)作爲主導的\ b替換方式,以特殊字符(如$!將被匹配。 – 2009-04-27 02:25:01

0

你的第一個問題是,你需要三個(可能爲四個)的情況下在你的交替,而不是兩個。

  • /\breverse!(?:\s|$)/反向!本身
  • /\bpush\b/推動自身
  • /\breverse!push\b/一起
  • /\bpushreverse!(?:\s|$)/這是可能的情況下

你的第二個問題是,因爲它不是一個\w一個\b將不是"!"後匹配。以下是Perl 5 has to say about \b,你可能想諮詢您的文檔,看他們是否同意:

詞邊界(「\ B」)是兩個字符之間的點,有一個「\ W」上的一面它和它的另一側的「\ W」(以任意順序),從字符串的開始和結尾開始計算虛數字符以匹配「\ W」。 (在字符類「\ b」表示退格,而不是一個單詞邊界,只是因爲它通常在任何雙引號字符串一樣。)

所以,你需要的正則表達式是一樣的東西

/ \b (reverse!push | reverse! | push) (?: \s | \b | $)+ /gx; 

我離開了/s,因爲沒有在這個表達式時期,因此可以看作是一條線是沒有意義的。如果/s並不意味着在您的引擎中將其視爲單行,則應該將其添加回來。另外,你應該瞭解你的引擎如何處理交替。我知道在Perl 5中,爲了獲得正確的行爲,您必須按照這種方式來安排這些項目(否則反向!總會贏得反向!推送)。

+0

再次閱讀問題,Chas; OP *不希望匹配「反向!推」。 – 2009-04-26 06:33:28

0

您可以通過一些等同替換\ B,但不太嚴格:

/(?<=\s|^)(reverse!|push)(?=\s|$)/g 

這樣的\b的(它可以實際\w字字符之前或之後只匹配)的限制因素被消除。

現在,空白或字符串的開始/結束可用作有效分隔符,並且內部表達式可以在運行時輕鬆構建,例如從搜索項列表中。 Chas;

相關問題