正規表現の作り方

投稿者: Anonymous

以下の条件の正規表現を作成したいです。

1はじめと終わりはひらがな
2文字列中には空白1つまたは「ぁ」から「ん」。
3空白は0〜1つ続いていい
4文字列中に空白は任意の数現れてもよい

やまだたろう=>OK
やまだ たろう=>OK
やま だ たろう=>OK
や ま だ た ろ う=>OK
山田たろう=>NG      //漢字
山田 たろう=>NG     //漢字、空白
ヤマダ たろう=>NG   //カタカナ
Yamada Tarou=>NG  //英語
 やまだ たろう=>NG  //スペースではじまる
やまだ  たろう=>NG  //スペース2つ

以上を踏まえて下記の正規表現を作成しましたが、空白が2連続以上でもマッチしてしまいます。どこを直せばいいのかご教授いただけないでしょうか。

作成した正規表現

^[ぁ-ん][ぁ-ん]*|s?[ぁ-ん]+$

解決

まずグループ化されない |

  ^[ぁ-ん][ぁ-ん]*
|
  s?[ぁ-ん]+$

と全体を分解しますからほとんど意図しないものになっています。「1. はじめと終わりはひらがな」なので

^[ぁ-ん]
  (
    [ぁ-ん]*
  |
    s?
  )
[ぁ-ん]$

が求めるものに近いです。これでも[ぁ-ん]*s?のどちらかが出現してもよいという意味ですので、「空白が2連続以上」を認めています。発想を少しひねって

  1. 文字列中には空白1つまたは「ぁ」から「ん」。
  2. 空白は0〜1つ続いていい

  1. 文字列中には空白1つまたは「ぁ」から「ん」。
  2. 空白は「ぁ」から「ん」の直後に0~1つ

と捉えることができます。これを表す正規表現は

^[ぁ-ん]
  (
    [ぁ-ん]
    s?
  )*
[ぁ-ん]$

ただしこのままでは2文字目が空白となれませんので、最終的に

^([ぁ-ん]s?)+[ぁ-ん]$

となるでしょうか。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *