8

Python で正規表現が機能しており、Java に変換しようとしています。実装に微妙な違いがあるようです。

正規表現は別の正規表現と一致しようとしています。問題の正規表現は次のとおりです。

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)

問題が発生している文字列の 1 つは次のとおりです。/\s+/;

正規表現は末尾に一致することは想定されていません;。Python では RegEx は正しく機能します (末尾の とは一致しません;が、Java では;.

質問):

  1. この RegEx を Java で動作させるにはどうすればよいですか?
  2. ここで読んだことに基づいて、この正規表現に違いはないはずです。Python と Java の RegEx 実装の違いのリストはありますか?
4

2 に答える 2

12

Java は、ごく一部のケースについて Python と同じ方法で正規表現を解析しません。この特定のケースでは、ネストされた[が問題を引き起こしていました。Python では、ネストされたものをエスケープする必要はありませ[んが、Java ではエスケープする必要があります。

元の正規表現 (Python 用):

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)

固定正規表現 (Java および Python 用):

/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/([gim]+\b|\B)
于 2012-05-08T16:53:01.183 に答える
9

Java と Python の明らかな違いは、Java では多くの文字をエスケープする必要があることです。

さらに、実際の正規表現表記の違いではなく、マッチング方法間の不一致に遭遇している可能性があります。

Java を考えると

String regex, input; // initialized to something
Matcher matcher = Pattern.compile( regex ).matcher( input );
  • Java のmatcher.matches()(またPattern.matches( regex, input )) 文字列全体に一致します。Python には直接同等のものはありません。で終わるre.match( regex, input )aを使用しても、同じ結果が得られます。regex$
  • Javamatcher.find()と Pythonre.search( regex, input )は、文字列のどの部分にも一致します。
  • Javamatcher.lookingAt()と Pythonre.match( regex, input )は文字列の先頭に一致します。

詳細については、Java のドキュメント を読んで、 Python のドキュメントMatcherと比較してください。

それは問題ではないとあなたが言ったので、私はテストを行うことにしました : http://ideone.com/6w61T;)。あなたの問題は他の場所にあります。

于 2012-05-08T04:03:50.637 に答える