@Rbiginer (初心者 R)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

正規表現の\.について

初歩的な質問ですみません。

正規表現のなかで文字としての.(.(文字)と書きます)を表現したい時、
例えば拡張子なんかを表現したい時って"\\..+$"って書きますよね。
区切りとしては
【\】【\.】【.+】【$】ですが、
二番目の【\.】は正規表現である.を\でエスケープしているので、.(文字)として扱う。
三番目の【.+】は一文字以上の任意の文字
四番目の【$】は末尾から

ってことなので、
【\.】【.+】【$】は
【.(文字)】【任意の文字列】【末尾が】になるので
末尾の.(文字)プラス任意の文字数なので、拡張子である.aaaの部分がヒットする、ここまでは理解できます。

ですが最初の【\】はなんでついているのかがわかりません。
実際のプログラムでも、最初の【\】がないとエラーがでます。

この【\】って後ろの【\.】に含まれる\をエスケープしているのでしょうか?

簡単なことで申し訳ありませんが、教えて頂いたら幸いです。

0 likes

2Answer

お使いの言語の文字列リテラル内に正規表現を書いているためだと思います。以下、 JavaScript を例にして説明しますが、他の多くの言語でも同様です。

JavaScript の文字列リテラルでは、バックスラッシュに続けて特定の文字を書くことで特殊な記号を表せます。たとえば "\n" は改行記号を表します。

> console.log("hello\nworld")
hello
world

文字列にバックスラッシュ文字そのものを含めるには "\\" と書きます。

> console.log("\\ is backslash")
\ is backslash

よって文字列に正規表現 \..+$ を含めるには "\\..+$" と書くことになります。

> console.log("\\..+$")
\..+$

> new RegExp("\\..+$").exec("foo.txt")[0]
'.txt'

つまり正規表現のエスケープ文字 \ を文字列リテラルに含めるためにもう一段階エスケープする必要があると言うことです。

なお、言語によっては正規表現リテラルが存在します。その中では正規表現のバックスラッシュをそのまま書くことができます。

> /\..+$/.exec("foo.txt")[0]
'.txt'
3Like

最初の\は要らなそうですが。

実際のプログラムでも、最初の【\】がないとエラーがでます。

具体的にどういうプログラムなんでしょうか?

0Like

Your answer might help someone💌