2016-02-07 15 views
5

私は、テキストファイル内のxmlのブロックを識別する正規表現を開発しました。式は、この(私は、すべてのJavaエスケープは、それが読みやすくするためにスラッシュ削除されている)のようになります。[ s S] *の違いは何ですか?と*。 Javaの正規表現では?

<\?xml\s+version="[\d\.]+"\s*\?>\s*<\s*rdf:RDF[^>]*>[\s\S]*?<\s*\/\s*rdf:RDF\s*> 

その後、私はそれを最適化し、それが突然、XMLを認識停止.*?[\s\S]*?を置き換えます。私の知る限りでは

\sはすべて空白記号を意味し、\Sは、すべての非白間隔のシンボルや[^\s]を意味ので[\s\S]は、論理的に、私は欲張りなフィルタを使用していませんでした.と同等でなければならないので、何が違いかもしれません?

+3

デフォルトでは、 '.'は行区切り文字と一致しません。'Patter.DOTALL'フラグを使うと、全ての文字(行区切り文字を含む)にマッチするかもしれません。すべての文字(行区切り文字を含む)を効果的に表現する、すべての空白と空白以外のすべての\ Sを含む '[\ s \ S]'が設定されています。 – Pshemo

+0

トレーリング?どちらの場合にも寄与しません。 – EJP

+0

非常に関連したもの:[*これらの違いは何ですか?](http://stackoverflow.com/a/14648811/3832970) –

答えて

6

正規表現.\s\Sは、.がデフォルトで行終端記号(改行など)をキャッチしないため、等価ではありません。

回線終端装置は、以下のいずれかであるoracle website.マッチ

に任意の文字(またはラインターミネータと一致してもしなくてもよい)

よる:

  • 改行(改行)文字('\n')、
  • キャリッジ・リターン文字が改行文字("\r\n")、
  • スタンドアロンキャリッジ・リターン文字('\r')の直後、
  • 次行文字('\u0085')、
  • 行区切り文字('\u2028')または
  • 段落区切り文字('\u2029)。

2つの式は、必要なフラグが設定されていない限り、同等ではありません。ここでも、OracleのWebサイトを引用:UNIX_LINESモードが有効にされて

場合、その認識だけ行末 は改行文字です。

正規表現.は、DOTALLフラグが指定されていない限り、 ターミネータを除くすべての文字に一致します。

+1

はい、違いを説明します、ありがとう – Dmitry

2

Hereはすべてのregexコマンドを説明するシートです。

基本的には、\s\Sは改行を含むすべての文字をピックアップします。 .はデフォルトでピックアップ行ターミネータを使用しません(特定のフラグを設定する必要があります)。

+0

はい、すべてがダブルエスケープされています。私は読みやすいようにダブルスラッシュを削除しました。式は機能しますが、 '[\ s \ S] *? 'を'。*?'に置きかえるとすぐに動作しなくなりますので、違いがあります。 – Dmitry

+0

これは実際の式です。<\\?xml \\ s + version = \ "[\\ d \\。] + \" s \\?> \\ s * <\\ s * rdf: RDF [^>] *> [\\ s \\ S] *?<\\ s * \\/\\ s * rdf:RDF \\ s *> ' – Dmitry

+0

これは当てはまりません。 '.'は特定のフラグに応じて改行をエスケープします。 –

関連する問題