プロが教えるわが家の防犯対策術!

電話番号の正規表現で、下記のように表現するといいと教えていただきました。

  /^0(?(?=[1-9]0)\d{10}|\d{9})$/

いろいろ調べてその意味について理解しようとしましたが、

0から始まる半角数字で、合計10桁か11桁ということはわかるのですが、

?の使い方についていまいちです。

特に

 ?(?=[1-9]0)

の部分が不明です。

詳しい解説をお願いできる方いらっしゃいますでしょうか。

A 回答 (5件)

正規表現 (の書き方) については改めて調べてもらうことにして.



/^0[5-9](?(?=0)\d{9}|\d{8})$/
だと, 最初の 0 のあとは 5~9 でないとだめだよ. つまり, 例えば東京 03 エリアなんかは全部アウトになる.

「00 ではじまる番号」を弾きたいならたとえば
/^0[1-9](?(?=0)\d{9}|\d{8})$/
かなぁ.
/^0[1-9](?:0\d|[1-9])\d{8}$/
でもよさそうだけど.
    • good
    • 0
この回答へのお礼

度々のご回答ありがとうございます。

おっしゃる通りですね。

先頭に[5-9]を入れてしまうと、北海道やら、東京やらの、

市街局番がぬけますね。

詳しい判別は、IF 等で、する必要がありそうです。

それにしても、正規表現は、覚えれば便利ですね。

ありがとうございます。

お礼日時:2021/06/03 20:22

> [1-9]0 の意味がわかりません。



/^0[1-9]0/ は、日本の電話番号計画における
0A0 特番プレフィックスに一致します

010 : 国際電話 / 桁数不定
020 : 電子機器 / 桁数11桁以上
030 : 廃止
040 : 廃止
050 : IP電話 / 桁数11桁
060 : 携帯電話予定
070 : 携帯電話 / 桁数11桁
080 : 携帯電話 / 桁数11桁
090 : 携帯電話 / 桁数11桁

参考)
https://www.soumu.go.jp/main_sosiki/joho_tsusin/ …
https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC …
    • good
    • 1
この回答へのお礼

たびたびのご回答ならびに詳しいご解説ありがとうございます。

私はどうも考え違いをしていたようで、

[1-9]0

の 0 は正規表現で特別な意味をもつのかなと思い込んでいました。

[1-9]0

の部分は、二桁の数字と考えればいいんですよね。

先頭の ^0

と併せて考えると

 ^0(?(?=[1-9]0)

の部分で3桁と考えればいのかなと思いました。




ただよくよく考えると、先頭が

0+0+0以外

の順番になると、9桁でマッチして

00+0以外の数値

もマッチするようにおもいました。


よくわかりませんが、

先頭から 

  00

にマッチさせないようにするには、文法的にいいのか不明ですが、

教えていただいた番号を考えて、

 /^0[5-9](?(?=0)\d{9}|\d{8})$/

のようにすれば、携帯は11桁、家電は10桁のハイフンなし、

でマッチさせることができるのかなと思いました。

お礼日時:2021/05/31 20:29

例えば


123
という正規表現が何を表すかはわかりますか?
    • good
    • 0
この回答へのお礼

サジェスチョンありがとうございます。

123

は三桁の数字だと思うのですが。

お礼日時:2021/05/31 20:10

(?(condition)yes-pattern|no-pattern)


条件式を評価してパターンを変える

(?=pattern)
パターンに一致する文字列の先頭箇所(アンカーの一種)

(?(?=x)y|z)
ここが x の先頭箇所なら y のパターン、でなければ z のパターン

^0(?(?=[1-9]0)\d{10}|\d{9})$
先頭が 0 で始まる
その後が [1-9]0 の先頭箇所なら後続に数字10桁、でなければ数字9桁
その後で文字列が終わる
    • good
    • 3
この回答へのお礼

ご丁寧な解説ありがとうございます。

>(?(condition)yes-pattern|no-pattern)
>条件式を評価してパターンを変える

なんですね。全体は理解できたと思います。

ただ、

[1-9]の部分は、数字の1から9を表すと理解できるのですが、

[1-9]0 の意味がわかりません。

補足お願いできないでしょうか。

お礼日時:2021/05/28 20:42

https://perldoc.perl.org/perlre

ちなみにそこで切っちゃダメ.
    • good
    • 0
この回答へのお礼

サイトのご紹介ありがとうございます。

横文字なので、ちょっと、理解が難しいです。

それと

>ちなみにそこで切っちゃダメ.

がよくわかりませんでしたすみません。

お礼日時:2021/05/28 20:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!