「空白文字」が世の中に何種類あるかご存じですか?半角スペース、全角スペース、タブ、改行くらいは分かると思いますが、実は世の中にはもっと空白文字があります。なんと空白文字だけで30文字以上もあります。これだけある空白文字を、/\s/
は果たして網羅できているのでしょうか?今回はこれについて調べてみました。
'\s'にマッチするスペース文字の一覧
ここのページに書いてあるスペース文字について、\s
にマッチするか検証してみま した。
結論から書くと、\sは全てを網羅していませんでした。 青くなっている方が\s
にマッチした文字、赤くなっている方がマッチしなかった文 字です。
名称 | 文字 |
---|---|
FILE SEPARATOR | [] |
GROUP SEPARATOR | [] |
RECORD SEPARATOR | [] |
UNIT SEPARATOR | [] |
HANGUL JUNGSEONG A-EU | [ᆣ] |
HANGUL JUNGSEONG YA-U | [ᆤ] |
HANGUL JUNGSEONG YEO-YA | [ᆥ] |
HANGUL JUNGSEONG O-YA | [ᆦ] |
HANGUL JUNGSEONG O-YAE | [ᆧ] |
MONGOLIAN VOWEL SEPARATOR | [] |
ゼロ幅空白 | [] |
ワード接合子 | [] |
HANGUL FILLER | [ㅤ] |
水平タブ (HT) | [ ] |
改行 (LF) | [ ] |
垂直タブ (VT) | [] |
フォームフィード (FF) | [] |
復帰キャリッジ・リターン (CR) | [ ] |
スペース | [ ] |
ノーブレークスペース | [ ] |
OGHAM SPACE MARK | [ ] |
EN QUAD | [ ] |
EM QUAD | [ ] |
EN SPACE | [ ] |
EM SPACE | [ ] |
THREE-PER-EM SPACE | [ ] |
FOUR-PER-EM SPACE | [ ] |
SIX-PER-EM SPACE | [ ] |
FIGURE SPACE | [ ] |
PUNCTUATION SPACE | [ ] |
THIN SPACE | [ ] |
HAIR SPACE | [ ] |
NARROW NO-BREAK SPACE | [ ] |
MEDIUM MATHEMATICAL SPACE | [ ] |
和字間隔 | [ ] |
ゼロ幅のノーブレークスペース | [] |
ゼロ幅文字
名称 | 文字 |
---|---|
結合書記素接合子 | [͏] |
ゼロ幅空白 | [] |
ゼロ幅非接合子 | [] |
ゼロ幅接合子 | [] |
記述方向制御(左から右へ) | [] |
記述方向制御(右から左へ) | [] |
LRE | [] |
RLE | [] |
[] | |
LRO | [] |
RLO([[になってますが誤字ではありません) | [] |
関数適用 | [] |
不可視の乗算記号 | [] |
不可視の区切り文字 | [] |
行区切り文字 | [ ] |
段落区切り文字 | [ ] |
ゼロ幅のノーブレークスペース | [] |
マッチしない空白文字が思っていた以上にありますね。
仕様書を見てみる
仕様書を読んで確認をしてみます。
ECMA-262 8th Edition(ES2017)には\s
について次のような記述があります。
Return the set of characters containing the characters that are on the right‐hand side of the WhiteSpace or LineTerminator productions.
つまり、「\s
は空白文字、あるいは行末文字にマッチする」ということです。
ECMAScriptで空白文字、行末文字は次のように定められています。
空白文字
- U+0009(水平タブ)
- U+000B(垂直タブ)
- U+000C(フォームフィード)
- U+0020(普通のスペース)
- U+00A0(ノーブレークスペース)
- U+FEFF(ゼロ幅のノーブレークスペース)
- その他のUnicodeのSpace_Separator
その他のUnicodeのSpace_Separatorというのは次のとおりです(参考: https://www.compart.com/en/unicode/category/Zs)
- U+1680(オガム文字のスペース)
- U+2000(n幅の四角形)
- U+2001(m幅の四角形)
- U+2002(n字幅の空白)
- U+2003(m字幅の空白)
- U+2004(1/3m幅の空白)
- U+2005(1/4m幅の空白)
- U+2006(1/6m幅の空白)
- U+2007(数字用空白)
- U+2008(句読点用空白)
- U+2009(狭い空白)
- U+200A(非常に狭い空白)
- U+202F(幅の狭いノーブレークスペース)
- U+205F(中くらいの大きさの数学用空白)
- U+3000(全角スペース)
行末文字
- U+000A(改行)
- U+000D(復帰キャリッジ・リターン)
- U+2028(行区切り文字)
- U+2029(段落区切り文字)
'\s'と等価な正規表現とは?
つまりまとめると、\s
は次の正規表現と同じです。
// /\s/ /[\u0009\u000a\u000b\u000c\u000d\u0020\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]/
終わりに
というわけで、「\s
は世の中のすべての空白文字を網羅しているわけではない」と分かりました。
半角スペース・全角スペース・タブに対応していれば十分なケースが多いですが、本当にすべての空白文字に対応しなければいけない場面は \s
では事足りないことは覚えておきましょう。
(空白文字に対応する場面というのは、例えば入力必須のユーザー名などです。そこで空白文字が通ってしまうと、あたかもユーザー名が空のように表示されてしまいます)