質問: タイトルの通りで、`0000000000`のような10文字以上同じ数字の数字列を検知する正規表現を教えていただきたいです。 正規表現チェッカーを使っていろいろ試してみたんですが、`1234512345`等の数字列も拾ってしまっており悩んでいます。 初心者的な質問で申し訳ありませんが、よろしくお願い致します。
回答: 俗に「正規表現」と呼ばれているものにも実は何種類かあって、微妙に異なります。特にこの種のちょっと複雑なものは正規表現の種類 BRE か ERE を明示しておかないと想定した動きと異なったりします。下記ではシェルスクリプト中で `grep` を使うものとして記述します。必然的に `grep -e` は BRE で、同様 `grep -E` は ERE となります。 さて考え方ですが * 任意の [数値文字] は `[0-9]` または `[[:digit:]]` (後者は `0-9` の代わりが `[:digit:]` であることに注意。実用の際には更に `[]` で括ることになります) * [10個以上] は**繰り返しマッチ**で表現できそうです。 BRE なら `\{10,\}` ERE なら `{10,}` ですが `grep -e '[0-9]\{10,\}' test.txt` あるいは `grep -E '[0-9]{10,}' test.txt` ではご指摘の通り「任意の数値文字の10回以上」にヒットしてしまいます。なのでひと工夫必要です。 コメントにて @metropolis 氏が書かれた `\1` を使うと「実際にヒットした文字」を引っ張ってこれます。これを使う際には部分正規表現にする必要があるので丸括弧で括る必要があり BRE なら `\([[:digit:]]\)\1` ERE なら `([[:digit:]])\1` とすると `11` とか `22` とかにヒットし `10` とか `48` とかにはヒットしなくなります。ここまでできたら繰り返し数を1減らせばよいわけで、コメントにある通り BRE なら `grep -e '\([[:digit:]]\)\1\{9,\}' test.txt` ERE なら `grep -E '([[:digit:]])\1{9,}' test.txt` この場合、繰り返し指定は直前の部分正規表現 `\1` の繰り返し(=既にヒットした数値文字)ということになりますね。 `grep` で「その行全体」でなく「マッチしたところだけ」表示したいなら `grep -o -e ...`