java 正则 懒惰_正则表达式懒惰模式

在写BLOG练习程序的时候,考虑到用BBS直接输入可能会更加简洁些。但是如何转换又成了一个问题。

在群里问了问朋友,一致认同使用正则表达式最好。于是又翻起了那篇我觉得很好的正则表达式三十分钟入门,看了很多篇,动手的也就这一次了。。

动起手来才发现不是这么简单,起先由于只考虑到静态链接的规则(其实那时静态写的比这下面写的复杂多了),没有办法又准备写一些动态链接的规则,但是一看动态的格式好像十分复杂,就干脆用.+来匹配了。

9310e85a14af99de4811ff4c77f1f911.png

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

后来才发现一个很严重的问题。如果其中的链接地址为www.xxx.com的话那么打开链接时,会发现它居然会作为你的子路径打开。

没办法又重新加了一个能够验证协议头的正则(我也不知道有没有2两个字符开头的协议。。。)

9310e85a14af99de4811ff4c77f1f911.png

24a924a57ba6b3f2b51fc9edb7ea4186.pngCodec=Regex.Replace(c,@"\[URL\](?([a-zA-z]{3,}://)[^\s]+)\[/URL\]","${url}", RegexOptions.Compiled);

当然这个匹配必须在上一个匹配之上。

查看了模仿的博客才发现,原来MAIL地址前是要加mailto://协议头的。

9310e85a14af99de4811ff4c77f1f911.png

24a924a57ba6b3f2b51fc9edb7ea4186.pngCodec=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]字符串,

由于尝试了很多次方法,最后才不得不得出一个结论(希望哪位能够指正出是否正确):

9310e85a14af99de4811ff4c77f1f911.png

24a924a57ba6b3f2b51fc9edb7ea4186.pngCode/[URl/].+[^(URL)]/[/URL/]/[URl/].+[^/bURL\b)]/[/URL/]

中括号只能匹配范围。

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

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

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

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

9310e85a14af99de4811ff4c77f1f911.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值