最近在csdn論壇看到這樣一個問題:
高分求一Regex
內容可能是純淨的文本 或者 含有html標籤
如:fsdfsfs <font color="sla tegra y">撒旦飛灑a 撒範德薩...a </font>fsfdsfsdfds
要實現:將html標籤外的a 替換成 b 而標籤體內的a 不受影響即上段內容中 <font>標籤中 color屬性值中的字元a不能被替換
希望能給出Regex以及替換方法
(原貼:http://topic.csdn.net/u/20100302/15/d15498be-97bb-448b-9f5b-b3ba7a6e111d.html )
結果就一大堆人在苦思冥想各種正則的解法。
Regex在匹配複雜substring的時候確實有其作用。但是這種對substring以外有特別要求的情況卻不應合適。
就算在某個“正則實現”中可以辦到(據說.net中這種就可以辦到),但是由於每個實現環境之間都有可能不同grep vi 或者js 或者java都會有所區別。
而就解決該問題而言使用簡易“詞法掃描”更合適。而且其要求是針對mark類文法進行判別,這裡甚至不用“回溯”的詞法掃瞄。
個人提供如下方式,其實就是“編譯原理中”最最基本的東西了:
String str="fsdfsfs <font color=/"slategray/">撒旦飛灑a撒範德薩...a </font>fsfdsfsdfds ";</p><p> //替換<br /> char[] chars=str.toCharArray();<br /> Stack<Character> stack=new Stack<Character>(); //可以改良stack實現來最佳化效能<br /> for (int i = 0; i < chars.length; i++) { //簡單過濾<...>標籤 需要的話增加該詞法解析的功能<br /> switch(chars[i]){<br /> case '<' :<br /> stack.push('<');break;<br /> case '>' :<br /> if(stack.peek()=='<')stack.pop();break;<br /> case 'a' :<br /> if(stack.isEmpty()==true)chars[i]='b';break;<br /> default:<br /> break;<br /> }<br /> } </p><p> //顯示<br /> System.out.println(new String(chars));<br />