1. ホーム
  2. regex

[解決済み] 展開された正規表現では、どのように解釈されますか?

2022-03-05 08:20:55

質問内容

<ブロッククオート

ERE内でバックスラッシュ文字( \, \a, \b, \f, \n, \をエスケープシーケンスの開始とみなします。

次に \\n[\\\n] の両方が必要です。 \\n[\\\n] という意味です。 \ の後に改行が続くのですが、このような並びをどう解釈すればいいのか、具体的な処理に迷っています。 \ は全く必要ないのですか?

アップデイト

私はプログラム言語の正規表現を理解することに問題はないので、以下の文脈を作成してください。 レキサー .

[root@ ]# echo "test\
> hi"

解決方法は?

これは、プログラミング言語とその文字列処理オプションに依存します。

例えば、Javaの文字列では、文字列の中にリテラルなバックスラッシュが必要な場合、それをダブルにする必要があります。そのため、正規表現 \n は次のように書かなければなりません。 "\\n" . 正規表現を使ってバックスラッシュをマッチングさせる場合、バックスラッシュを2回エスケープする必要があります。つまり \ の場合、正規表現は \\ であり,対応するJava文字列は "\\\\" .

多くのプログラミング言語には、バックスラッシュをエスケープする必要のない特殊なquot;verbatim"またはquot;raw"文字列が存在します。そのため、正規表現 \n は、通常のPythonの文字列として、次のように書くことができます。 "\\n" またはPythonの生の文字列として r"\n" . Python の文字列 "\n" が実際の改行文字です。

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

しかし、結果として得られるシーケンスが有効な文字エスケープシーケンスである場合に、バックスラッシュをエスケープし忘れると、悪いことが起こります。たとえば、正規表現 \bfoo\b は単語全体にマッチします foo (にマッチします(ただし foofoobar ). もし、正規表現文字列を "\bfoo\b" を使用すると、その \b は文字列処理によってバックスペース文字に変換されるため、 正規表現エンジンに <backspace>foo<backspace> これは明らかに失敗です。

解決策 逐語的な文字列がある場合は常にそれを使用する (例: Python の r"..." .NETの @"..." を使うか、正規表現がある場合はそれを使うか(例えば、JavaScript や Ruby の /.../ ). また RegexBuddy を使えば、正規表現をあなたの言語の特殊な形式に自動的に翻訳してくれます。

例題に戻るには

  • \\n を正規表現として使用すると、バックスラッシュに続いて n "
  • [\\\n] を正規表現にすると、"バックスラッシュまたは改行文字のいずれかに一致する"という意味になります。