提高我的正则表达能力

时间:2009-07-13 17:48:32

标签: html regex matching

我一直想要提高我的正则表达技能已经有一段时间了,而且“掌握正则表达式”被推荐了很多次,所以我买了它并且在过去一天左右阅读它。

我创建了以下正则表达式:

^(?:<b>)?(?:^<i>)?<a href="/site\.php\?id=([0-9]*)">(.*?) \(([ a-z0-9]{2,10})\)</a>(?:^</i>)?(?:</b>)?$

哪个与前两个链接匹配,但忽略<i>标记所包含的两个链接。 它提取id,标题和类型。

<a href="/site.php?id=6321">site 1 title (type 1)</a>
<b><a href="/site.php?id=10254">site 2 title (type 2)</a></b>

<i><a href="/site.php?id=5479">site 3 title (type 3)</a></i>
<b><i><a href="/site.php?id=325">site 4 title (type 4)</a></i></b>

虽然它有效,但对于这么简单的东西来说似乎相当长,可以改进吗?

2 个答案:

答案 0 :(得分:5)

不使用字符类(\ d表示0-9等)我没有看到有问题的正则表达式可以缩短很多;然而...

作为旁注,值得一提的是,使用正则表达式解析HTML至多是危险的;在处理HTML(以及较小程度的XML)时,DOM工具通常更适合。

答案 1 :(得分:1)

如果你的写作屏幕截图作为Whilliham正确地提到DOM可能只是一个合适的解析器作为正则表达式,因为HTML更加宽容然后正则表达式。

没有多少缩短,但正则表达式更宽容

  • 删除字符串的开头并结束 字符串检查,你真的需要吗? 它们?
  • 负面的背后隐藏,以确保<a>
  • 之前不会<i>
  • 使用\ d简单的论文代替[0-9] tad清洁工。
  • 您输入了3到11个字符,我将其更改为3个或更多。
  • 删除了对结束标记的检查,它们不会为您的screenscrapper提供上下文含义(大概)。

(?<!<i>)<a href="/site.php\?id=(\d*)">(.*?) \(([ a-z\d]{2,})\)