据我了解,您正在尝试查找<
后面没有相应字符的>
字符。适合您的示例,我们可以这样做:
<(?![^<]*>)
例如:http ://regexr.com/?373kl
分解,这是:
< # literal '<' character
(?! # negative lookahead
[^<]* # 0 or more characters that are not '<'
> # literal '>' character
) # (closing the lookahead)
前瞻检查它遇到的下一个尖括号是否是>
. 由于它是一个负前瞻,因此如果不是这种情况,它就会匹配。
更新
做相反的事情——识别>
前面没有相应<
字符的字符——要复杂得多。这是因为在包括 Java 在内的大多数正则表达式引擎中,lookbehinds 的长度必须是固定的(即,您不能使用像+
and之类的量词*
)。所以我们不能真正使用lookbehind,这在概念上是我们需要的。
一些正则表达式引擎具有\K
允许我们有效地伪造可变长度后视的构造,但 Java 不是其中之一。所以我们必须在>
我们想要的之前捕捉到所有的东西,然后想办法忽略那些字符。
这是一种方法:
(?:^|>)[^<>\r\n]*(>)
例如:http ://regexr.com?373m2 (将鼠标悬停在比赛上以查看组)
周围有括号>
,因此它将被单独捕获为一个组。(这样你就可以隔离它并获得它在字符串中的位置。)
分解,这是:
- 一个非捕获组
(?:^|>)
(因为我们不需要它作为一个单独的组),
- 一个否定的字符类
[^<>\r\n]*
,和
>
其自己的捕获组中的“大于”字符
(?: # non-capturing group
^|> # ^ start of line or '>' character
)
[^<>\r\n]* # 0 or more characters other than '<', '>', or newlines
(>) # literal '>' character in its own capturing group
这里的想法是我们开始查看行首或>
我们通过的最后一个右括号之后。我们发现的下一个无与伦比的>
将单独在第 1 组中。