2012-03-06 104 views
3

我要匹配有作爲邊界的「__」字符序列(兩個下劃線)如何匹配字符串組不包含一些子

例如串組:

hello __1the_re__ my name is __pe er33__ 

「1the_re」和「PE er33」亦宜

我的問題是定義

/__((?!__).*)__/ 
「不包含字符序列串」

我試過這個,但它不工作...

謝謝!

回答

3

你接近:

/__((?!__).)*__/ 

作品。星星必須在重複組之外,因此前瞻在每個位置執行,而不僅僅是前導__之後。

因爲這不捕獲正確的文本(我猜你想要的雙下劃線之間的內容被捕獲),你可能想

/__((?:(?!__).)*)__/ 
+0

不錯!好吧,現在我明白我的正則表達式出了什麼問題,謝謝! – skyline26 2012-03-06 17:23:07

0

您可以使用非貪婪的標誌: 「?」。

/__((?!__).*?)__/g 
// javascript: 
>>> "hello __1the_re__ my name is __pe er33__".match(/__((?!__).*?)__/g) 
["__1the_re__", "__pe er33__"] 
+3

這沒什麼意義 - 如果你讓量詞懶惰,你不需要前瞻斷言。 – 2012-03-06 17:19:16

1

裏面你的分組,要符合下列之一:

  1. 任何字符後跟任意字符不_
  2. 任何字符不_

正則表達式:

/__(.[^_]|[^_])*__/ 

由於第一場比賽第一,這是不言而喻的。爲了更好的匹配提取,添加非抓取標誌和匹配內:

/__((?:.[^_]|[^_])*)__/ 

例子:

$subject = 'hello __1the_re__ my name is __pe er33__'; 
$pattern = '/__((?:.[^_]|[^_])*)__/'; 
$r = preg_match_all($pattern, $subject, $match); 
print_r($match[1]); 

輸出:

Array 
(
    [0] => 1the_re 
    [1] => pe er33 
) 

但很明顯,它使只是更容易量詞懶惰:

/__(.+?)__/ 
相關問題