2011-05-03 151 views
3

開頭我正在解析一個文本文件,在每一行中運行,並且我在計算正則表達式時遇到了困難。部分解析涉及到發生的變化,如:正則表達式,找到一個字符串包含但不是以

& Eacute;到& eacute;

我試過以下的正則表達式,但它不返回任何東西:

/^(?!&)(É)/ 

有什麼建議?

+0

當你設計一個正則表達式時,你不能使用「發生如」。你在尋找什麼樣的特定模式?它會一直是'&E'嗎?你是否總是把它改成'&e'? – eykanal 2011-05-03 20:34:21

+0

假設我有以下幾行:HÉ llo。我想改變它,所以它是一個小寫的e。但是,如果線條以此開始,我不想更改它,因爲我寧願將其大寫。我正在使用String類的gsub方法進行替換。 – agmcleod 2011-05-03 20:35:36

+0

你想得到什麼? – fl00r 2011-05-03 20:35:58

回答

5

所以,只有當它不在行首時,你纔想匹配É

使用

/(?<=.)&Eacute;/ 

(假設Ruby 1.9的,因爲1.8不支持回顧後)

理由:.匹配除換行符任何字符。因此,如果lookbehind斷言匹配,我們不在該行的開頭。

+0

是的,這是訣竅:) – agmcleod 2011-05-03 20:41:13

+0

'(?!^)'應該可以在任何版本中工作。 – 2011-05-04 11:29:32

0

如果要上線的任何位置匹配&Eacute;,但不是在第一個位置:

/^.+(&Eacute;)/ 

此例如匹配"abc&Eacute;def",但不是"&Eacute;"

更新:修正了錯誤,指出由Tim

+0

這不起作用。它只在'&Eacute;'位於該行的位置2時才匹配。 – 2011-05-03 20:56:28

+0

@Tim你是對的,複製並粘貼錯誤。修復。非常感謝。 – 2011-05-04 06:21:06

+0

現在它只匹配在'&Eacute'之前在同一行上沒有其他HTML實體... – 2011-05-04 06:29:02

2

如果您在使用Ruby 1.9,你可以使用一個回顧後是這樣的:

t.gsub! /(?<=.)&Eacute;/, '&eacute;' 

在Ruby 1.8,你需要使用類似的方法:

while t =~ /(.)&Eacute;/ 
    t.sub! /(.)&Eacute;/, "#{$1}&eacute;" 
end 

其中t是要修改的字符串。

+0

't.gsub! /(?!^)&Eacute; /,'&eacute;'在Ruby 1.8中運行良好。 – 2011-05-04 11:33:21