2011-08-06 5 views
0

ERE内では、バックスラッシュ(\、\ a、\ b、\ f、\ n、 \ r、\ t、\ v)はエスケープシーケンスを開始すると見なされます。\ nと\ nは拡張正規表現によってどのように解釈されますか?

その後、私はここの両方\\n[\\\n]は、新しい行が続く\を意味しても、私は推測することができ、\\n[\\\n]を参照してください、しかし、どのように多くの\ sはで必要とされるように私は、このようなシーケンスを解釈するために、正確なプロセスによって混乱していますすべて?

UPDATE

私はそうthe lexer内のコンテキストを作成してくださいプログラミング言語で正規表現を理解する問題はありません。

[[email protected] ]# echo "test\ 
> hi" 
+0

テストしましたか?あなたが簡単に試すことができるものと思われます。 – yoda

+1

あなたはそれらをどこに見ますか?プログラミング言語の文字列ですか?あなたは "\ n"をエスケープする必要があるので、多くのプログラミング言語で "\ n"が実際に "\ n"であることを考慮していますか?したがって、正規表現が見ているのはちょうど '\ n'です –

答えて

1

これはプログラミング言語とその文字列処理オプションによって異なります。

たとえば、Java文字列の場合、文字列にリテラル・バックスラッシュが必要な場合は、その文字列を二重にする必要があります。したがって、正規表現\n"\\n"と書かれていなければなりません。正規表現を使ってバックスラッシュをマッチさせる場合は、Javaの文字列ハンドラの場合は1回、正規表現エンジンの場合は1回、エスケープする必要があります。したがって、\と一致するには、正規表現は\\であり、対応するJava文字列は"\\\\"です。

多くのプログラミング言語には、バックスラッシュをエスケープする必要のない特別な「逐語的」または「生の」文字列があります。したがって、正規表現\nは、通常のPython文字列として"\\n"、またはPython生の文字列としてr"\n"と書くことができます。 Python文字列"\n"が実際の改行文字です。

バックスラッシュをエスケープしないと動作しないことがあるので、混乱することがあります。たとえば、Pythonの文字列"\d\n"は、改行の後に数字と一致する正規表現として動作します。これは、\dがPython文字列で認識される文字エスケープシーケンスではないため、リテラル\dとして保持され、その方法で正規表現エンジンに送られるからです。 \nは実際の改行に変換されますが、正規表現がテストされる文字列の改行と一致します。

しかし、結果のシーケンスが有効な文字エスケープシーケンスであるバックスラッシュをエスケープした場合、悪いことが起こります。たとえば、正規表現\bfoo\bは、単語全体がfooと一致します(但し、foobarfooと一致しません)。正規表現文字列を"\bfoo\b"と書くと、\bは文字列プロセッサによってバックスペース文字に変換されるので、正規表現エンジンは明らかに失敗する<backspace>foo<backspace>と一致するように指示されます。

解決策:常にあなたがそれらを持って逐語的文字列使用するか、またはあなたがそれらを持っている正規表現リテラルを使用(E GのJavaScriptのとRubyの/.../。。)(。E GをPythonのr"..."、.NETの@"..."。)。または、RegexBuddyを使って正規表現をあなたの言語の特別なフォーマットに自動的に翻訳してください。

はあなたの例に戻って取得するには、次の正規表現が意味

  • \\nとして正規表現は「マッチバックスラッシュや改行文字のいずれかを」手段として
  • [\\\n]nバックスラッシュに続く、一致」を。
+0

そのページでは、 '\\ n'や' [\\\ n] 'の出現を確認できません。 –

+0

私はそうは思わない。上記のコメントにリンクしているページでは、バックスラッシュと 'n'を見つけるのに使います。 '\\ t'が' \ t'などに変換される他のすべての例を参照してください。 –

+0

このブロックは二重引用符でリテラル文字列を解析するために使用されます。 'に続く' nは意味をなさない。 –

関連する問題