0個以上の同じ文字だけからなる文字列にマッチする正規表現

#122
2025.5.10
2025.5.10

何らかの文字cに対して、これが0個以上並んだような文字列、例えば、"1111""a""ああ"""などを考えます。このような文字列にだけマッチするような正規表現を作ろうと思うと、一筋縄ではいきません。結論から言うと、後方参照をサポートしない正規表現エンジンの場合は、このような正規表現を現実的に記述することができません。

後方参照を使わない場合

現実的に記述できないと言うのは、不可能ではないが長すぎると言う意味です。例えば、c=\mathtt{0}のときだけを考えるなら、

^0*$

とすれば良いです。c=\mathtt{1}の時も考えるなら、

^(0*|1*)$

となります。このように、cが数字の場合だけなら

^(0*|1*|2*|3*|4*|5*|6*|7*|8*|9*)$

これくらいで済みますが、cが任意の文字の場合については明らかに現実的ではない長さの正規表現になってしまうことがわかります。

後方参照を使う場合

後方参照をサポートする正規表現エンジンでは、目的の正規表現を

^(.)?\1*$

として書くことができます。

これは、1文字目が存在するならそれを\1としてキャプチャし、2文字目以上はこの\1が0回以上続くような文字列にマッチする正規表現ですので、これが今回求めていた正規表現であることが見て取れるかと思います。

また、同じ文字が1個以上続く文字列にマッチする正規表現は、1文字目が確実に存在するので?を消して

^(.)\1*$

とすれば良いです。

Java、JavaScript、Pythonなどの昨今の言語の正規表現エンジンは大体後方参照に対応しているので、上記の正規表現を使うことが可能です。