2012-01-08 56 views
0

我的文字如下:查找小寫緊接着大寫

<font size=+2 color=#F07500><b> [ba]</font></b> 
<ul><li><font color =#0B610B> Word word wordWord word.<br></font></li></ul> 
<ul><li><font color =#F07500> Word word word.<br></font></li></ul> 
<ul><li><font color =#0B610B> Word word word wordWord.<br></font></li></ul> 
<ul><li><font color =#0B610B> WordWord.<br></font></li></ul> 
<br><font color =#E41B17><b>UPPERCASE LETTERS</b></font> 
<ul><li><font color =#0B610B> Word word wordWord word.<br></font><br><font color =#E41B17><b>PhD and dataBase</b></font> </li></ul> 
<font color =#0B610B> Word word word.<br></font></li></ul><dd><font color =#F07500>  »» Word wordWord word.<br></font> 

有一個小寫字母后面緊跟在每個<font color =#0B610B>...</font>的大寫。例如:

<font color =#0B610B> Word word wordWord word.<br></font> 

我希望通過拆分他們改正這個錯誤,如下所示(即:增加一個冒號和它們之間有一個空格):

<font color =#0B610B> Word word word: Word word.<br></font> 

到目前爲止,我一直在使用:

(<font color =#0B610B\b[^>]*>)(.*?</font>) 

選擇每個<font color =#0B610B>...</font>的情況下的,並且它通過<font color =#0B610B>...</font>一個實例找到一個實例工作正常。

但是當我使用:

(<font color =#0B610B\b[^>]*>)(.*?[a-z])([A-Z].*?</font>) 

它找到,但無論其他字體顏色標籤中選擇一個行<font color =#0B610B>...</font>之間的所有內容,並取代其他不需要的實例。

我希望它找到並在每個這種特定的對標籤的更換錯誤:<font color =#0B610B>...</font>,而不是由<font color =#0B610B>抓住一切啓動和</font>

結束是否有任何正則表達式來解決這個問題?提前謝謝了。

回答

1

一般來說,正則表達式不是解析HTML的好主意(如果它是一次性的,你可能會確定)。

我認爲這可能是你的正則表達式不工作的原因。 你能舉一個你的正則表達式失敗的例子嗎?我能想到的是,如果有

一種情況是匹配的一對<font color=#0B610B></font>內沒有匹配([a-z][A-Z]),但是在鄰近<font></font>。例如:

<font color=#0B610B>word word</font><font color=#000000>word wordWord</font> 

在這種情況下,只有有效匹配是<font color=#0B610B>word word</font><font color=#000000>word word和字符串Word</font>的休息,所以這是正則表達式匹配

(因爲如果能匹配它會!)

我可以想到一個粗略的解決方法,但我不會推薦它,除非這個任務是一次性的,因爲使用HTML的正則表達式總是容易出現這樣的錯誤!這個正則表達式也相當低效。嘗試(未經測試):

(<font color =#0B610B\b[^>]*>)(([^<]|<(?!/font))*?[a-z])([A-Z].*?</font>) 

它說,「認準<font colour=xxxx>標籤,跟隨一個尖括號<其次/font,或其他任何東西,再其次是[a-z][A-Z]」。 因此它試圖確保比賽不會超過</font>邊界。

+0

非常感謝,數學咖啡。我想這會幫助我,因爲它似乎找到了我想要的東西,但是當被'\ 1 \ 2:\ 3 \ 4'取代時,匹配變成了'單詞:xWord'。我不知道爲什麼字符** x **在這裏添加(** x **可以是任何字母)。 – 2012-01-08 12:45:02

+0

這是因爲有一個額外的內部捕獲括號,'\ 3'包含單個字符。請注意'\ 2'環繞'\ 3',所以用'\ 1 \ 2:\ 4'替換。 – 2012-01-08 23:36:11

+0

棒極了!你已經節省了我的一天,數學咖啡。它現在像一個魅力。非常感謝。 – 2012-01-09 09:33:58