<
私が理解しているように、対応する文字が続かない文字を見つけようとしています>
。あなたの例に合わせて、これを行うことができます:
<(?![^<]*>)
例: http://regexr.com/?373kl
分解すると、次のようになります。
< # literal '<' character
(?! # negative lookahead
[^<]* # 0 or more characters that are not '<'
> # literal '>' character
) # (closing the lookahead)
先読みは、次に遭遇する山かっこが であるかどうかを確認し>
ます。否定先読みなので、そうでなければマッチします。
アップデート
反対>
に、対応する<
文字が前にない文字を識別することは、はるかにトリッキーです。これは、Java を含むほとんどの正規表現エンジンでは、後読みが固定長でなければならないためです (つまり、+
やのような量指定子を使用することはできません*
)。そのため、概念的に必要な後読みを実際に使用することはできません。
いくつかの正規表現エンジンには、\K
可変長の後読みを効果的に偽造できる構造がありますが、Java はその 1 つではありません。したがって、必要な前にすべてをキャプチャしてから、>
それらの文字を無視する方法を見つける必要があります。
1 つの方法を次に示します。
(?:^|>)[^<>\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 の 1 人です。