2011-11-02 70 views
1

我想要做的就是文字和網址進行這樣的字符串:「簡單」的正則表達式不工作,我想如何?

這是一個標題[http://awebsite.com/a/download.zip]

這是我使用正則表達式:

/(.*?)[(.*?)]/ 

我知道是什麼問題...第一(.*?)是匹配整個字符串!但我不確定如何才能使它匹配到第一個[發生。

解釋我做錯了什麼,以及如何解決將是很好的謝謝你。我最終學習正則表達式!

謝謝你們

PS:使用PHP和preg_match功能。

+0

參見[有像開源世界中的RegexBuddy一樣?](http://stackoverflow.c在這個開放源代碼世界中)和['/(.*?)[(.*?)]/'visualized](http:/ /是什麼意思? /www.strfriend.com/vis?re=%2F%28.*%3F%29%5B%28.*%3F%29%5D%2F) – mario

回答

2

[(.*?)]是一個字符類和匹配之一:'(''.''*',或'?'')'

您需要轉義[,使它與文字'['匹配(並且]不是特殊的,因此它不需要轉義)。

/(.*?)\[(.*?)]/ 

參見:http://www.regular-expressions.info/charclass.html

+0

感謝您的解釋:)有道理。 –

+0

不客氣托馬斯。 –

2

你幾乎得到了它,但儘量逃避分組字符[和],所以你會得到:

/(.*?)\[(.*?)\]/ 
3

你的問題不是第一部分而不是第二部分。

你必須逃離[這樣的:

/(.*?)\[(.*?)]/ 

說明:

" 
(  # Match the regular expression below and capture its match into backreference number 1 
    .  # Match any single character 
     *?  # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
) 
\[  # Match the character 「[」 literally 
(  # Match the regular expression below and capture its match into backreference number 2 
    .  # Match any single character 
     *?  # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
) 
]  # Match the character 「]」 literally 
" 
+0

']'不會被轉義。 –

+0

@BartKiers:O不知道這一點。我猜是因爲它不可能是角色課的結束? – FailedDev

+0

只有當正則表達式引擎在它之前遇到'['''''''''''''''。所以如果沒有遇到'['',''''將會匹配'']'''儘管如此,它並沒有傷害。 –

1

你需要逃避[]字符:

/(.*?)\[(.*?)\]/ 
+0

'''不需要轉義。 –

+0

@BartKiers:是的,你是對的,這是我的習慣。 – Toto

+1

好吧,這不是一個壞習慣。它不會因爲逃避而受到傷害,並且有很多人在看到一個非轉義的']'時會感到困惑......當我看到一個轉義的'''時,我只是感到困惑,因爲我認爲']'被放置了在一個字符類中,像這樣:'[a \] b]',它匹配''a','']'或''b''。 –

相關問題