2013-10-05 73 views
1

我需要在字符串中的雙精度EOL之後插入一些額外的文本。我遇到了奇怪的現象:當我爲雙EOLS後符號的occurence正向前查找,所有工作幾乎罰款:正則表達式中的雙精度EOL

"A\n\nA".gsub /(^{2})(?=A)/, '♻' 
# ⇒ "♻A\n\n♻A" 

有一個在\A一個奇怪的比賽(字符串begginning),但它與OK我現在。發生真正的問題,當我嘗試負前瞻:

"A\n\nA".gsub /(^{2})(?!B)/, '♻' 
# ⇒ "♻A\n♻\n♻A" 
# WHAT? ⇑ 

請你解釋我 我在正則表達式,爲什麼中間匹配且 我怎麼可分別代替雙EOLS與我需要什麼誤會。

UPD中間匹配發生是因爲^是元字符,無匹配,謝謝@bsd。不過,用什麼方法替代雙EOL?我可能堅持。

在此先感謝。

+0

Uhmmm ......它在.gsub'的'前的狀態。 – mudasobwa

+0

@muda ..我覺得困了:) –

回答

2

我認爲你錯了,以爲^可以貪婪地匹配。 ^符合行首。

^也是一個元字符,它匹配字符之間的零寬度位置。連續換行符/起始字符之間有多少零寬度位置?它可能會在每個角色之前匹配。

看這個

"A\n\nA".scan /(^{2})(?!C)/ 
=> [[""], [""], [""]] 

你可能意味着它是

"A\n\nA".gsub /([\n]{2})(?!C)/ , "\\1♻'" 
=> "A\n\n♻A" 

編輯:

所以,如果你想讓它在所有平臺上。你可以寫爲:

"A\r\n\r\nA".gsub /((?:\r?\n){2})(?!C)/ , "\\1♻" 
=> "A\r\n\r\n♻A" 

"A\n\n\n\nA".gsub /((?:\r?\n){2})(?!C)/ , "\\1♻" 
=> "A\n\n♻\n\n♻A" 

EDIT2: @Alan穆爾說,在紅寶石2.0,可以簡化上述正則表達式

"A\n\n\n\nA".gsub /(\R{2})(?!C)/ , "\\1♻" 
+0

嗯,我知道'[\ n] {2}',但字符串來自用戶輸入,它在不同的平臺上......你知道的。感謝您提供關於元字符匹配的建議,我絕對會錯過的。 – mudasobwa

+0

@mudasobwa編輯答案 – bsd

+1

如果您運行的是Ruby 2.0或更高版本,則可以使用'\ R {2}'來達到同樣的效果。 –