有些情境是不適合用“Regex”的

來源:互聯網
上載者:User

最近在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 />

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.