当前位置: 首页 > >

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)]/[/URL/]


中括号只能匹配范围。


就是这个简单的问题困扰了我整整两天。


今天群里的朋友提起可以参看别人的URL匹配规则,于是又搜索了一次(比我这详细多了)


认真地看了几次后,终于发现了另一种思维,懒惰模式,匹配尽可能少的字符。


于是最后就可以写成这样:



Codec=Regex.Replace(c,@"[URL](?[^s]+?)[/URL]","${url}",?RegexOptions.Compiled);


还是浮躁了些,没有认真看完那篇教程。害得自己一直在苦钻牛角尖啊。



友情链接: