16217


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

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

例

[code]

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

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

作成した正規表現

[code]

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


CC BY-SA 3.0
2015-09-04T01:40:40.833
16214
2015-09-04T02:17:11.163
7232
question
正規表現
正規表現の作り方


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

[code]

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

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

[code]

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

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

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

を

  2. 文字列中には空白1つまたは｢ぁ｣から｢ん｣。
  3. 空白は｢ぁ｣から｢ん｣の直後に0～1つ

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

[code]

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

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

[code]

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

となるでしょうか。


CC BY-SA 3.0
2015-09-04T02:17:11.163
16217
2015-09-04T02:17:11.163
4236
16214
answer