2013-11-29 55 views
1

是否可以在某種模式之後匹配所有內容?正則表達式 - 在指定模式後匹配

starting-this is my string- 

例如與上面的例子中我知道該字符串將與一些字母和一個連字符,然後我想要的值其將由另一連字符被終止啓動。

所以我想找到的例子:「這是我的字符串」

是否可以用正則表達式來做到這一點?

回答

2

取決於。 RegExp的每個實現都不同。例如,你不能用JavaScript做,但你可以用Ruby。你正在尋找的功能稱爲「積極向後看」。

/(?<=starting-)this is my string(?=-)/ 

你有正回顧後,在這裏積極前瞻的例子:前者是一個零寬度斷言背後「這個」你「的起始 - 」,而後者是一個零寬度斷言在「字符串」之後你有「 - 」。

RegExp的大部分口味都是超前的。有些人(如JS)不具有向後看。

如果你的沒有,你可以做一些技巧。最簡單的一種是隻是做一個非正則表達式反向預搜索,並捕獲所需的字符串:

/starting-(this is my string)-/ 

然而,由於比賽不能重疊,你可能無法有時使用這種方法。例如,如果你試圖以匹配散列包圍的話,並嘗試

/#(\w+)#/g 

,並嘗試它像一個字符串「我的#馬#喜歡#吃#乾草#的#早餐#」,你不僅會得到「馬」,「吃」和「換」,因爲「#吃#」和「#爲#」的比賽會消耗「乾草」和「早餐」周圍的散列。

另一種是反轉字符串和模式,並使用lookahead代替;但是這樣看起來很糟糕,而且只有當你不需要同時模式下的前瞻和後視時纔有效。

+1

男人,你就錯了約JS。考慮''開始 - 這是我的字符串 - 「。match(/^starting - ([^ - ] *) - /)'。 – twil

+0

@twil:我確實考慮過它,並拒絕它 - 你可以閱讀我更新的答案,理由。具體來說,嘗試使用您的方法從我的示例中匹配「馬」,「吃」,「乾草」,「爲」,「早餐」。 – Amadan

+0

你的回答很好,但是你用另一個問題代替了另一個問題,並且在提出問題時陳述錯誤。 – twil

0

是的。使用這個:

(?<=textyouwanttomatchafter).* 

這個例子可以在java中使用,並且在其他語言中應該是類似的。

1

如果您告訴我們您正在使用的語言,這將有所幫助。對於Perl,這將工作:

/starting-([^-]+)-/ 

該字符串將存儲在$ 1。一內膽:

$ perl -le '"starting-this is my string-" =~ m/starting-([^-]+)-/; print $1;' 
this is my string 

這裏是an example in JavaScript

(function() { 
    var str = 'starting-this is my string-'; 
    var matches = str.match(/starting-([^-]+)-/); 
    alert(matches[1]); 
})(); 
+0

這比「這是我的字符串」更廣泛地匹配。 – Amadan

+1

@Amadan,這與匹配的東西匹配 - 連字符之間的一些值 – twil

+0

這個*捕獲*已經被問到的東西。它*更廣泛地匹配*。看到我的答案,其中兩個不可互換的例子。 – Amadan

0

您可以使用捕捉這一個羣體:

starting\-(.*?)\- 

這場比賽將是第二個小組。

您可以使用一個匹配:

(?<=starting-).*(?=-) 
+0

這比「這是我的字符串」更廣泛。 – Amadan

+0

使用組進行匹配。 – Szymon

+0

它*匹配*「開始 - 這是我的字符串 - 」。它*捕捉*「這是我的字符串」。我指出了一個區別。如果你只是想提取一個單一的值,通常就足夠了;看到我的答案是不適合的情況。 – Amadan