java 正则 懒惰_正则表达式懒惰模式
在寫BLOG練習程序的時候,考慮到用BBS直接輸入可能會更加簡潔些。但是如何轉換又成了一個問題。
在群里問了問朋友,一致認同使用正則表達式最好。于是又翻起了那篇我覺得很好的正則表達式三十分鐘入門,看了很多篇,動手的也就這一次了。。
動起手來才發現不是這么簡單,起先由于只考慮到靜態鏈接的規則(其實那時靜態寫的比這下面寫的復雜多了),沒有辦法又準備寫一些動態鏈接的規則,但是一看動態的格式好像十分復雜,就干脆用.+來匹配了。
Codec=Regex.Replace(c,@"\[URL\](?[^\s]+)\[/URL\]","${url}",?RegexOptions.Compiled);
后來才發現一個很嚴重的問題。如果其中的鏈接地址為www.xxx.com的話那么打開鏈接時,會發現它居然會作為你的子路徑打開。
沒辦法又重新加了一個能夠驗證協議頭的正則(我也不知道有沒有2兩個字符開頭的協議。。。)
Codec=Regex.Replace(c,@"\[URL\](?([a-zA-z]{3,}://)[^\s]+)\[/URL\]","${url}",?RegexOptions.Compiled);
當然這個匹配必須在上一個匹配之上。
查看了模仿的博客才發現,原來MAIL地址前是要加mailto://協議頭的。
Codec=Regex.Replace(c,@"\[EMAIL=(?[A-Z0-9a-z\.]+@[a-zA-Z]{2,}\.[a-zA-z]{2,3})\](?[^\s]+?)\[/EMAIL\]","${title}",?RegexOptions.Compiled);
c=Regex.Replace(c,@"\[EMAIL\]([A-Z0-9a-z\.]+@[a-zA-Z]{2,}\.[a-zA-z]{2,3})\[/EMAIL\]","$1",?RegexOptions.Compiled);
考慮大多數用戶習慣直接輸入郵件地址不會包含maito://協議頭的。所以沒有寫這個規則了。
后來又發現一個問題如果文中有多個URL的話,由于.+的緣故會導致匹配出許多我們不是我們想要的字符。起先思路一直停留在,其中不能包含[/URL]字符串,
由于嘗試了很多次方法,最后才不得不得出一個結論(希望哪位能夠指正出是否正確):
Code/[URl/].+[^(URL)]/[/URL/]/[URl/].+[^/bURL\b)]/[/URL/]
中括號只能匹配范圍。
就是這個簡單的問題困擾了我整整兩天。
今天群里的朋友提起可以參看別人的URL匹配規則,于是又搜索了一次(比我這詳細多了)
認真地看了幾次后,終于發現了另一種思維,懶惰模式,匹配盡可能少的字符。
于是最后就可以寫成這樣:
Codec=Regex.Replace(c,@"\[URL\](?[^\s]+?)\[/URL\]","${url}",?RegexOptions.Compiled);
還是浮躁了些,沒有認真看完那篇教程。害得自己一直在苦鉆牛角尖啊。
總結
以上是生活随笔為你收集整理的java 正则 懒惰_正则表达式懒惰模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java主方法引用传递_java方法中的
- 下一篇: java el ognl_el表达式跟o