2013-04-18 16 views
1

我正在處理Ruby 1.8.7中的一些文本處理以支持我創建的一些自定義簡碼。這裏是我的簡碼的一些例子:Ruby正則表達式太貪心背靠背匹配

[CODE first-part] 
[CODE first-part second-part] 

我使用正則表達式如下搶

text.gsub!(/\[CODE (\S+)\s?(\S?)\]/i, replacementText) 

問題是這樣的:正則表達式不會在下面的文字工作:

[CODE first-part][CODE first-part-again] 

的結果如下:

1. first-part][CODE 
2. first-part-again 

似乎\s?是正在搜索的正則表達式中有問題的部分,直到它遇到最後一個空間,而不是第一個空間。當我將正則表達式更改爲以下內容:

\[CODE ([\w-]+)\s?(\S*)\]/i 

它工作正常。我唯一擔心的是所有\w\s,因爲我想確保\w將匹配URL安全字符。

我確定這裏有一個完全有效的解釋,但它無法解釋我。有任何想法嗎?謝謝!

+1

「我唯一擔心的是所有\ w vs \ s。」那是什麼意思?你可以使用一個否定的字符類btw:'[^]]或'[^ \]]'(應該是相同的)將匹配任何非'''字符。 –

+0

其實我是S +這是你的問題,因爲它會匹配標記你事物結束的[]。 –

+0

@ m.buettner - 我正在編輯與您下面的評論相同的秒,但僅僅是因爲我在這裏看到您的評論。那謝謝啦! –

回答

2

其實,思考它,只是用[^\]]可能是不夠的,因爲它會吞噬了所有的空間爲好。您還需要排除這些:

/\[CODE[ ]([^\]\s]+)\s?([^\]\s]*)\]/i 

請注意[ ] - 我只是認爲它使字面空間更具可讀性。

Working demo.

在自由空間模式說明:

\[CODE[ ] # match your identifier 
(   # capturing group 1 
    [^\]\s]+ # match one or more non-], non-whitespace characters 
)   # end of group 1 
\s?   # match an optional whitespace character 
(   # capturing group 2 
    [^\]\s]+ # match zero or more non-], non-whitespace characters 
)   # end of group 2 
\]   # match the closing ] 

由於沒有字符類的模式包括],你可以永遠不可能超越的方括號表達式的結束。

順便說一句,如果你發現在正則表達式不必要逃逸的模糊,因爲我做的,這裏是最低版本:

/\[CODE[ ]([^]\s]+)\s?([^]\s]*)]/i 

但是,這絕對是一個品味的問題。

+0

這是優越的,我覺得我現在太累了,不能在正則表達式中思考。 。 。 –

+0

所以否定字符'^'實際上適用於括號後面的所有內容?很酷!現在測試... –

+0

非常棒!謝謝! –

1

問題是貪心\S+在這個

/\[CODE (\S+)\s?(\S?)\]/i 

你可以嘗試:

/\[CODE (\S+?)\s?(\S?)\]/i 

但實際上你的新角色類是IMO superiror。

更妙的可能是:

/\[CODE ([^\]]+?)\s?([^\]]*)\]/i 
+0

不應該刪除第一個'\]'並替換第二個'\ S'?看到一切都應該在一組方括號內 –