首页 > 解决方案 > 如果未找到下一个关闭,RegExp 忽略开始字符

问题描述

如果 RegExp 包含某些字符,有没有办法忽略匹配?我环顾四周,发现在某些情况下可以正常工作的负面匹配(?!\<)。但是在找到下一个左括号之前,我无法找到一种方法来创建带有可选任何字符的否定匹配。我很抱歉解释不佳。这是一个我想更有意义的例子。

const text = "hello <friend>. My age is < twenty <unit>.>Signature<<signature>."
const matches = text.split(/(\<(?!\<).*?\>)/g)
// ["hello ", "<friend>", ". My age is ", "< twenty <unit>", ".>Signature<", "<signature>", "."]

问题是"< twenty <unit>"。我真正寻找的是价值中的两个元素"< twenty ", "<unit>"

标签: javascriptregexregex-negation

解决方案


使匹配 的负前瞻(?!)部分。./(<((?!<)[^>])*>)/

这样,每次*匹配点时,它都必须符合外观。

前瞻比后瞻效果更好,因为您关心的不匹配字符是下一个字符,而不是前一个字符。

此外,将任何匹配项替换为.=[^>]可防止everything except closing tag结束标记过冲。

除了前瞻,您还可以将其重写为/(<[^><]*>)/, =match everything between opening and closing tag that does not contain any tag

我刚刚重读了你的问题。如果我理解正确并且您也想匹配外部标签,直到内部标签的开始,您可以使用它。它匹配开头<+ 任何非标记 + 关闭(>如果存在)

<[^><]*>?

推荐阅读