PPP's Blog

雑コード帳

正規表現で全角スペースを検知する

環境

全角スペースを正規表現で検索する

検索欄で全角スペースを入れる。たとえば、「半角スペースあるいは全角スペース」は(\s| )で表現できる。

おわり。

全角スペースは文字で表現できないの?

以下、結論の無い文章が続きます。

全角スペースを入れれば良いだけだが、それだと何か微妙だな…と思い※、全角スペースを文字で表現できないのか調べてみた。(表題の要件は、すでに先述の内容で満たしている。「微妙」に特に意味はない。)
※最初にQUANONさん正規表現で全角スペースを探す記事を読んで、そこから文字で全角スペースを表現できないか実際にVSCodeでやってみた。

調べてみると、\p{Z}というのが引っかかった。これは、UnicodeブロックとかUnicodeカテゴリと呼ばれるものらしい。実際にVisual Studio Codeでそれを検索欄に入れると、全角スペースが引っかかるのがわかる。同時に、半角スペースも対象になっていることもわかる。

さて、そもそも\p{Z}が何を意味しているのかということを知る必要があるのだが、これが調べてみてもさっぱり分からない。「すべての区切り記号」らしい。スペース(空白)が区切りなのはまだわかるとして、「すべての」とはいったい何なのだろうか。 (以下に続く文章に答えはありません。)


話を横道にそらす。

Perlの公式ドキュメント\p{}のことが書かれていて、そこには、「Perl正規表現である\p{}および\p{}構文は、Unicode 文字のプロパティのほとんどにアクセスすることができます。」とある。

The Perl regular expression \p{} and \P{} constructs give access to most of the Unicode character properties. The table below shows all these constructs, both single and compound forms.

また、別の箇所には、「例えば、\p{Uppercase}Unicode "Uppercase" プロパティを持つ任意の1文字にマッチし、一方\p{L}は General_Category of "L" (letter) プロパティを持つ任意の文字にマッチします("General_Category" を参照。)。一文字のプロパティ名には括弧は必要ないので、\p{L}\pLと同じです。」とあって、\p{}はそのGeneral Categoryに属するプロパティの値にマッチできるというのがわかる。

For instance, \p{Uppercase} matches any single character with the Unicode "Uppercase" property, while \p{L} matches any character with a General_Category of "L" (letter) property (see "General_Category" below). Brackets are not required for single letter property names, so \p{L} is equivalent to \pL.

で、\p{Z}はそのGeneral Categoryに属するプロパティなので、アクセスできたと。いうことよね…。ここで行き詰まりました。


閑話休題

ちょっと『\p{Z}が何を意味しているのか』を調べる体力が無いのでここまでで記事を切りたいと思います。。そもそも全角スペースって正規表現だとどう表すんだってのを知りたかっただけなので、目的は果たしたのだ…!

本当におしまい。