質問: textarea に一行一アドレスで特定ドメインのメールアドレスを列挙させた際に、angular.js の ng-pattern でそれをチェックしたいと思っています。 メールアドレスは * xxxx@example.net * xxxx@example.or.jp のいずれかのドメインのもので、これを入力する textarea を以下のように(erb 中に)記載しました。 ``` <%= text_area_tag :mails, params[:mails], {size: "50x10", style: 'font-size: x-large', placeholder: raw('foo_bar_baz@example.or.jp fuga_hoge@example.net'), 'ng-pattern' => '/^([-\w\.]{3,8}@(example\.or\.jp|example\.net)(\n|\r\n)?){2,}$/', 'ng-model' => 'mails', 'ng-required' => 'true'} %> ``` 上記の ng-pattern は試行錯誤した結果なのですが、これだと ``` hoge@example.netfuga@example.or.jp ``` の様に一行に複数のアドレスが記載されても OK になってしまいます。 正規表現で改行の判定ができていないのがダメだと思うので、どなたかご教示頂けると嬉しいです。 よろしくお願い致します。
回答: ``` 'ng-pattern' => '/^([-\w\.]{3,8}@(example\.or\.jp|example\.net)\b(\n|\r\n)?){2,}$/' ``` このパターンを使ってみてください。違いは単語境界(`\b`)を一つ加えただけです。 `?`は「0個または1個」の意味なので、`(\n|\r\n)?`だけでは改行があっても無くてもよいことになり、改行なしで連続したアドレスにもマッチしてしまいます。 かといって`(\n|\r\n)`のようにアドレスの後の改行を必須にしてしまうと、angular.jsがtextareaの最後の改行を無視する関係上、正しい入力でもマッチしません。 `\b(\n|\r\n)?`とすると行の終わりもしくは文字列の終わりにマッチするので正しく判定できます。