

クレジットカードの名前のところで、正規表現を使って入力値を制限しようとしていますが、うまくいかずにいます。

if (source.toString().matches("^[A-Z\s]+$".toRegex())  
&& source.toString().matches("^[^\n]+$".toRegex())){

}

上記はうまくいくのですが、これを１つの正規表現で記述したいです。  
※ "^[A-Z\s]+$" -> これだと改行が通る


CC BY-SA 3.0
2017-06-15T11:53:07.553
35610
2017-06-15T17:17:44.583
23810
question
正規表現
正規表現で、ローマ字の大文字と半角スペースのみを有効な値としたい


`\s` は空白を意味し、TABやCR(行頭復帰)、LF(改行)が含まれます。  
質問の内容を砕くと

  * 先頭から末尾までが、AからZまでの文字もしくは空白にマッチ
  * 先頭から末尾までが、改行文字でない文字にマッチ

ですのでコメント欄にもある通り、空白 `\s` をスペース `` に変えてしまうのが手っ取り早いです。

ただし、このパターンには問題があり、おそらく `FOO BAR`
といった物を期待されておられるかと思いますが、実はスペースが先頭や末尾に来てもマッチしてしまいます。それどころか全てスペースでもマッチします。

名前をマッチしたい場合は `^[A-Z][A-Z ]+[A-Z]` の様に先頭と末尾に必ず `[A-Z]`
が入る事を確認した方がよいです。また空白が連続しない事も確認すべきです。  
あと、氏名が1文字というのは考えにくいので他の条件も必要かと思います。

1文字でも良いのであれば、`^([A-Z]+)( [A-Z]+)*$` が良いかと思います。


CC BY-SA 3.0
2017-06-15T17:17:44.583
35614
2017-06-15T17:17:44.583
440
35610
answer