2011-06-29 18 views
0

我正在構建一個需要匹配: text to match -內部文本的項目。舉例來說,如果我有這樣的字符串:正則表達式匹配內部文本: -

nathanpc/ltweet:要求在#StackOverflow一個問題: 「正則表達式匹配的內部文本: - 」 - @devs

我想匹配Asking a question at #StackOverflow: "Regular Expression To Match a Text Inside : -"。在第一個:和最後一個-之後的所有內容,但是要做到這一點的正確正則表達式是什麼?

PS:我使用JavaScript使用jQuery

回答

2

如果你使用Perl兼容的正則表達式,像那些在大多數語言中發現:

/:(.*)-/ 

您可能不需要的斜線,根據不同的語言。捕獲組1將獲得您想要的內容。

.*是一個貪婪的匹配器,所以它會嘗試匹配儘可能多的字符,直到輸入中的最後一個短劃線。

+1

True +1。更簡單,直接。也許OP不想將空格分成'/:\ s(。*)\ s- /'。 –

0

「標準」正則表達式無法解析完全按照你描述的這個文本。該解析需要一些上下文,這不能用正則表達式。例如,當接收到第一個「 - 」時,表達式如何不結束?

在我的腦海中,我只能使用Perl擴展正則表達式,它允許子表達式解析,但它不會很容易,因爲您必須計算「:」和「 - 」的出現次數完全匹配最後一個。

1

如果使用的是貪婪的運營商像.它會嘗試形成最大的比賽可能(至少在Perl兼容的正則表達式引擎)

因此,爲了匹配這個一樣簡單:(.*)-將工作的東西。

請參見本示例腳本中的Perl:

my $str = "Discard:Testing:- one two three -discard"; 
$str =~ m/:(.*)-/; 
print $1; 

$1 = "Testing:- one two three"

或者在JavaScript這裏:http://www.regular-expressions.info/javascriptexample.html

+0

再次,這將無法正常工作。 Perl如何知道不要停止在第一個「 - 」? –

+0

這是一個貪婪的運營商。 Perl試圖在它放棄之前最大限度地擴展它。 – Bayes

+0

問題是「放棄」的定義:)再一次,這通常不起作用。 –

1

這對我的作品(紅寶石):

[^:]+:\s+([^-]+.*?)\s- 

測試:

test = "nathanpc/ltweet: Asking a question at #StackOverflow: 'Regular Expression To Match a Text Inside : -' - @devs" 

m = test.match /[^:]+:\s+([^-]+.*?)\s-/ 

然後

m[1].to_s 

產生

Asking a question at #StackOverflow: 'Regular Expression To Match a Text Inside : -' 

正如其他人所注意到的要簡單得多:(.*)-的工作原理相同。也許沒有空格:\s(.*)\s-