DOBON.NET DOBON.NETプログラミング掲示板過去ログ

\pの正規表現のエスケープ方法

環境/言語:[C#]
分類:[.NET]

お世話になります てんてんです。

文字列の中で
「\par\r\n」を検索したいのですが、
Regex("\\par\r\n", RegexOptions.IgnoreCase);
で設定したのですが以下のエラーが出ます。

System.ArgumentException' のハンドルされていない例外が system.dll で発生しました。

追加情報 : 解析中 "\par
" - 間違った形式の \p{X} エスケープ文字です。

解決策アドバイス頂けないでしょうか

それでは 失礼致します。
> 文字列の中で
> 「\par\r\n」を検索したいのですが、
> Regex("\\par\r\n", RegexOptions.IgnoreCase);

Regexの引数として渡す正規表現は"文字列"として渡ります
\をstringで表現する場合は"\\"もしくは@"\"ですよね?
つまり正規表現として認識される文字列はこのままでは
"\p"+"er"+"(改行)"
になってしまいます。
正規表現としての文字列ではなく
stringで表現できる文字列して考えなければいけません。

ちなみに\r\nでも同様です。多分このままでは改行の検知はできないかエラーになると思います。
■No8760に返信(bellさんの記事)

> Regexの引数として渡す正規表現は"文字列"として渡ります
> \をstringで表現する場合は"\\"もしくは@"\"ですよね?
> つまり正規表現として認識される文字列はこのままでは
> "\p"+"er"+"(改行)"
> になってしまいます。
> 正規表現としての文字列ではなく
> stringで表現できる文字列して考えなければいけません。

bellさんアドバイス有難うございます。
何度も読み直して言われる意味を理解しようとがんばったのですが
アドバイスを理解出来ませんでした。

結局\parを正規表現でどう記述すればよいのでしょうか
# 短絡的に答えだけ求めるとお叱りを受けるかも。

■No8782に返信(てんてんさんの記事)
> 何度も読み直して言われる意味を理解しようとがんばったのですが
> アドバイスを理解出来ませんでした。

ソースコード上にあるエスケープシーケンスを含んだ文字列、それをコンパイ
ラが解釈した結果の値としての文字列、さらに正規表現パーサが解釈するエス
ケープ文字と解釈した結果の照合対象文字、それらすべて勘案しなくてはなり
ませんよ、といった話でしょうね。

> 結局\parを正規表現でどう記述すればよいのでしょうか

正規表現としての \p は、Unicode のグループやブロック範囲を表す文字クラ
スです。照合対象文字としての \p を表現するにはエスケープ文字を使う必要
があります。ただし、\ は通常のリテラル文字列においてのエスケープシーケ
ンスに使われますから、文字列としての \ を表現するにはエスケープシーケ
ンスを使う必要があります。

かくて、通常のリテラル文字列を使って正規表現の照合対象文字としての \par
を表現しようとすると、非常に冗長に見える記述が必要になります。ですから、
普通は正規表現としての文字列には、逐語的リテラル文字列を使うことが多い
ようです。

まあ、早い話が、

"\\\\par\\r\\n"

か、

@"\\par\r\n"

と書けってことです。
おおた様レス有難うございます。

■No8791に返信(おおたさんの記事)
> # 短絡的に答えだけ求めるとお叱りを受けるかも。
色々試してた経過を書けばよかったですね
すみません。

> かくて、通常のリテラル文字列を使って正規表現の照合対象文字としての \par
> を表現しようとすると、非常に冗長に見える記述が必要になります。ですから、
> 普通は正規表現としての文字列には、逐語的リテラル文字列を使うことが多い
> ようです。
> "\\\\par\\r\\n"
> @"\\par\r\n"

有難うございます。
こうやって、結果を書いていただけると無能な私でも
意味が理解できました。

感謝です。

これで、別スレッドでの質問も解決しそうです。
本当に有難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板