1

わかりましたので、これに適した正規表現を試してみましたが、次の範囲までしか行きません:

(<(.*)(<))|(<(.*)).

しかし、これにはいくつかの問題があります。

最初に、正規表現を使用して、孤児より小さい位置の正確な位置を指摘する必要があります。上記の正規表現は、<10%やのような場合に完全に機能し< abb123 <asdsad>ます。

しかし、<asdad> <asdsad>一致したくないものも一致します。<10% <asdad> <asdsad>また、tag2 の小なり記号にも一致 し、 が得られ<10% <asdad> <ます。

私は使用しているのでこれが起こっていることを知って(.*)いますが、すべてに一致できるものを使用する方法を考えるのに苦労していますが、> 2つの< <の間にあるため、次のような場合

  `<tag1><tag2>`

は一致せず、小<tag1><tag2><10%なりの後に他の小なりまたは大なり以外の文字、文字、および数字が続かないようなものと一致させることができます。

4

1 に答える 1

3

<私が理解しているように、対応する文字が続かない文字を見つけようとしています>。あなたの例に合わせて、これを行うことができます:

<(?![^<]*>)

例: 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 人です。

于 2013-11-07T17:06:35.530 に答える