質問: 以下の条件の正規表現を作成したいです。 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連続以上」を認めています。発想を少しひねって > > 2. 文字列中には空白1つまたは「ぁ」から「ん」。 > 3. 空白は0〜1つ続いていい > > > を 2. 文字列中には空白1つまたは「ぁ」から「ん」。 3. 空白は「ぁ」から「ん」の直後に0~1つ と捉えることができます。これを表す正規表現は ``` ^[ぁ-ん] ( [ぁ-ん] \s? )* [ぁ-ん]$ ``` ただしこのままでは2文字目が空白となれませんので、最終的に ``` ^([ぁ-ん]\s?)+[ぁ-ん]$ ``` となるでしょうか。