题
我想提高我的正则表达式技能已经有一段时间了,并且“掌握正则表达式”被推荐了很多次,所以我买了它并在过去一天左右的时间里一直在阅读它。
我创建了以下正则表达式:
^(?:<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工具一般更适合。
不隶属于 StackOverflow