2012-06-01 16 views
-4
$string = "hello/welcome"; 

我只想要「welcome」。我怎樣才能匹配在perl中使用(?:正則表達式)如下的模式

$string = "hello-welcome-to-the-world"; 

我想「你好,歡迎光臨」

我試試這個

print $1 if($string =~ m#(?:/|)(.*)(?:-to-)#); # got hello-welcome 
print $1 if($string =~ m#(?:/)(.*)(?:-to-|)#); # got welcome 

,但我不能能夠得到從單一的正則表達式所需的輸出。 請解決和解釋......

使用該(?:\w.+/)?(.*?(?=$|-to-)),我得到的答案都是字符串

+2

你能澄清的問題是什麼?也許顯示你的輸出相比你的預期輸出。 – kevlar1818

+0

如果問題得到解決,請接受答案,或發佈您如何做的答案。 –

回答

1

此正則表達式匹配您的兩個案例。期望的輸出也在$1

((?:\w+-)?welcome) 

(?:\w+-)?的任選相匹配的單詞然後連字符前的歡迎。由於它可以選擇匹配,如果它不在那裏,輸出只是「歡迎」。

+0

看起來不錯,我得到了輸出。 是否有可能匹配這些不匹配「歡迎」? 之後,最後的斜槓和「-to」。 謝謝 – Parthipan

+0

感謝凱夫拉爾,我從你的邏輯得到了答案 我改變了一點「(?:\ w。+ /)?(。*?(?= $ | -to-))」 – Parthipan

+0

回答你的問題,請接受答案。 – kevlar1818

0
(?<=^|/).*?(?=$|-to-) 

這匹配(字符串或斜槓的開始)和(字符串或 - 到 - 的結尾)之間的最短匹配。

這是許多情況下提取捕獲組不是必要的,如果你使用lookaround的另一個。

編輯:由於可變長度回顧後不起作用,試試這個:

(?<![^/])[^/]*?(?=$|-to-) 
+0

謝謝frey。 我得到錯誤「可變長度lookbehind沒有在正則表達式中實現m /((?<=^| /).*?(?=$ | -to - ))/」以匹配那些字符串。 – Parthipan

+0

我編輯了問題並添加了另一個版本的正則表達式。 –

+0

對不起frey,第二個字符串正確返回,但第一個字符串不返回任何值。 (?:\ w。+ /)?(。*?(?= $ | -to-))「 感謝frey。 – Parthipan