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

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

^(?:<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>

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

有帮助吗?

解决方案

如果你像Whilliham那样编写屏幕截图,正确地提到DOM可能是正则表达式的合适解析器,因为HTML比正则表达式更宽容。

没有缩短太多,但正则表达式更宽容一些

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

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

其他提示

中使用字符类的短(\ d为0-9等)我没有看到所讨论的正则表达式可以缩短很多;然而...

作为一个方面说明它可以是值得一提的使用正则表达式语法分析HTML是危险充其量;与HTML处理时(以及在较小程度上XML),DOM工具一般更适合。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top