我有这个正则表达式,可以在格式良好的HTML标记中获取内容,但是现在我的问题是:只有嵌套标记时,才如何获取内容?
<([.]*[^>]+)>(.*)<\/(?:\1[^>]?)>
正则表达式(带案例): https://regex101.com/r/iHnSCs/3
示例:
<h1><a>content inside</a></h1>
我只想获取“ content inside”一词,而不是<a> </a>
此问题的目的不是要在生产中或一般情况下使用正则表达式,而是关于格式正确的标签并迫使您自己使用正则表达式解决此问题。是here找到的HackerRank Strings Java挑战的一部分。
答案 0 :(得分:0)
如果所有标签都是平衡且格式正确的,例如您一直都有打开和关闭标签(没有<img/>
废话),则可以尝试使用递归来执行此操作。某些正则表达式引擎支持(?R)
的递归。
基本上不是放置内容部分(.*)
,而是放置匹配内容或整个内容的东西(将嵌套标签与带有标签的标签等匹配):类似(\w+|(?R))
。
注意:为简单起见,我在这里使用\w+
而不是.*
,您可能还需要其他内容,但是我不建议您使用.*
(它太宽泛,会贪婪地使用吃掉角色直到失败为止,从而耗尽内存和时间。
在此处查看示例:
* https://www.regular-expressions.info/recurse.html
(匹配平衡结构)
* http://www.rexegg.com/regex-recursion.html
答案 1 :(得分:0)
您需要的是正则表达式中的第二个捕获组(.*)
,您可以使用$2
为了在第一个HTML标签<h1>
中获得内容,我使用replace
方法,如下所示:
let text = `<h1><a>content inside</a></h1>`;
let text1 = text.replace(/<([.]*[^>]+)>(.*)<\/(?:\1[^>]?)>/,"$2");
console.log("text1",text1); // <a>content inside</a>
let text2 = text1.replace(/<([.]*[^>]+)>(.*)<\/(?:\1[^>]?)>/,"$2");
console.log("text2",text2); // content inside
我在这里使用了javascript。根据您打算使用的语言,您可以使用$2
或\2