0

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

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

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

它与前两个链接匹配,但忽略了<i>标签所包含的两个链接。它提取 id、title 和 type。

<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>

虽然可行,但对于这么简单的事情来说似乎相当长,可以改进吗?

4

2 回答 2

5

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

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

于 2009-07-13T17:55:59.120 回答
1

如果您像 Whiilliham 正确地提到 DOM 那样编写屏幕截图,那么 DOM 可能只是作为 Regex 的合适解析器,因为 HTML 比 regex 更宽容。

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

  • 删除了字符串开头和结尾检查,你真的需要它们吗?
  • 负面回顾以确保之前<a>没有<i>
  • 使用 \d 简单的断言而不是 [0-9] 更干净。
  • 您输入了 3 到 11 个字符,我将其更改为 3 个或更多。
  • 删除了对结束标签的检查,它们对你的屏幕截图没有上下文意义(大概)。

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

于 2009-07-13T18:11:27.433 回答