gpt4 book ai didi

java - 正则表达式匹配不在 标签内的短语

转载 作者:太空宇宙 更新时间:2023-11-04 10:28:40 25 4
gpt4 key购买 nike

我有一些 HTML,我需要匹配不在 <a> 内的短语“我的短语”标签。

不应匹配的短语:

1. <a>My Phrase</a>
2. <a><strong>My Phrase</strong></a>

应该匹配的短语:

3. <strong>My Phrase</strong>
4. My Phrase

我的当前解决方案使用负向前瞻来查找后面没有结尾 </a> 的匹配项。标签:

My Phrase(?![^<]*>|[^<>]*<\/a)

https://regex101.com/r/n1d9KZ/1

正如您在示例中看到的,它适用于常规文本链接(情况 1),但当“a”标记内嵌套有其他标记时,它会破坏情况 2。

有人有一个适用于两者的负向前看正则表达式吗?

我无法将负向后查找与正则表达式一起使用,例如 (?<!<a.*?>.*?)My Phrase(?!.*?<\/a>)因为我收到错误 java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length 。我也不想解析 HTML 并删除所有当前的“a”标签,因为我需要保持 HTML 完整并将“My Phrase”替换为“Another Phrase”。

最佳答案

您尝试做的事情并不是那么微不足道,因为实际上不可能(只有 Jeff Dean 可以)使用 RegEx 完全处理 HTML。

因为到处都可能有新行,具有复杂的属性和嵌套或只是无效。

无论如何,在您的示例的情况下(没有 href,标签内和标签内没有新行),您可以执行以下操作:

result = text.replace(/^.*?(My Phrase).*?$/gm, function($0,$1) { 
var regEx = new RegExp("(" + $1 + ")");
return $0.indexOf('<a') >= 0 ? $0 : $0.replace(regEx, '<b>$1</b>');
});

我只是将示例中的匹配项加粗,但您可以在回调中执行许多操作: https://jsfiddle.net/8Ls0qbvj/

关于java - 正则表达式匹配不在 <a> 标签内的短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50306475/

25 4 0