用于匹配任意两个 HTML 标签的正则表达式
Posted
技术标签:
【中文标题】用于匹配任意两个 HTML 标签的正则表达式【英文标题】:RegEx for matching between any two HTML tags 【发布时间】:2019-10-06 19:26:59 【问题描述】:我有以下内容:
<div class="TEST-TEXT">hi</span>
<a href=\"https://en.wikipedia.org/wiki/TEST-TEXT\">first young CEO's TEST-TEXT</a>
<span class="test">hello</span>
我正在尝试匹配 TEST-TEXT 字符串以替换它的值,但仅当它是文本且不在属性值内时。
我已经检查了正则表达式中的前瞻和后视概念,但当前的问题是它需要使用固定宽度进行匹配这里是一个链接regex-match-all-characters-between-two-html-tags,它展示了一个非常相似的案例但有一个例外是有一个类的跨度来创建一个匹配 还检查了链接regex-match-attribute-in-a-html-code
这是我正在尝试的两个正则表达式:
\"([^"]*)\" (?s)(?)(.+?)(?=)
两者都不适合我尝试使用 [https://regex101.com/r/ApbUEW/2]
当它是文本时,我希望它只匹配字符串 它匹配两种情况的当前行为
编辑:我希望文本是动态的,而不是特定于 TEST-TEXT
【问题讨论】:
预期输出是什么? 正则表达式不足以解析 HTML ***.com/questions/590747/… @TheScientificMethod 匹配第三个 TEST-TEXT,即两个标签的内部文本 @PushpeshKumarRajwanshi Kumar Rajwanshi 您还建议使用什么? 试试:TEST-TEXT(?=<\/a>)
【参考方案1】:
这样的事情应该会有所帮助:
\>([^"<]*)\<
编辑:
不包括打开和关闭标签:
(?<=\>)([^"<]*)(?=\<)
【讨论】:
这也将包括我希望它只匹配里面的字符串。 这将匹配标签之间的任何文本,我希望它匹配特定的字符串【参考方案2】:试试TEST-TEXT(?=<\/a>)
TEST-TEXT
匹配 TEST-TEXT
?=
提前检查结束标签</a>
见 regex101
【讨论】:
TEST-TEXT(?=) 将匹配所有标签,但我仍然希望文本是动态的 要使其动态化,请使用TEST-TEXT(?=<\.*>)
不匹配任何东西【参考方案3】:
在这里,我们可能只是在所需输出的右侧添加一个软边界,您已经在这样做,然后为所需输出添加一个 char 列表,然后收集,之后我们可以使用捕获组进行替换()
。可能与此类似:
([A-Z-]+)(<\/)
演示
这个 sn-p 只是为了表明这个表达式可能是有效的:
const regex = /([A-Z-]+)(<\/)/gm;
const str = `<div class="TEST-TEXT">hi</span><a href=\\"https://en.wikipedia.org/wiki/TEST-TEXT\\">first young CEO's
TEST-TEXT</a><span class="test">hello</span><div class="TEST-TEXT">hi</span><a href=\\"https://en.wikipedia.org/wiki/TEST-TEXT\\">first young CEO's
TEST-TEXT</a><span class="test">hello</span>`;
const subst = `NEW-TEXT$2`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
正则表达式
如果不需要此表达式,可以在 regex101.com 中修改或更改它。
正则表达式电路
jex.im 还有助于将表达式可视化。
【讨论】:
只有在我正在寻找的字符串是文本而不是属性值的所有情况下都有一个结束标签时才有效。【参考方案4】:也许这会有所帮助?
String html = "<div class=\"TEST-TEXT\">hi</span>\n" +
"<a href=\\\"https://en.wikipedia.org/wiki/TEST-TEXT\\\">first young CEO's TEST-TEXT</a>\n" +
"<span class=\"test\">hello</span>";
Pattern pattern = Pattern.compile("(<)(.*)(>)(.*)(TEST-TEXT)(.*)</.*>");
Matcher matcher = pattern.matcher(html);
while (matcher.find())
System.out.println(matcher.group(5));
【讨论】:
只有当它是两个标签之间的唯一字符串时才会匹配它。【参考方案5】:任意两个 HTML 标签之间的字符串的正则表达式
(?![^<>]*>)(TEST\-TEXT)
【讨论】:
以上是关于用于匹配任意两个 HTML 标签的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章