質問: クレジットカードの名前のところで、正規表現を使って入力値を制限しようとしていますが、うまくいかずにいます。 if (source.toString().matches("^[A-Z\s]+$".toRegex()) && source.toString().matches("^[^\n]+$".toRegex())){ } 上記はうまくいくのですが、これを1つの正規表現で記述したいです。 ※ "^[A-Z\s]+$" -> これだと改行が通る
回答: `\s` は空白を意味し、TABやCR(行頭復帰)、LF(改行)が含まれます。 質問の内容を砕くと * 先頭から末尾までが、AからZまでの文字もしくは空白にマッチ * 先頭から末尾までが、改行文字でない文字にマッチ ですのでコメント欄にもある通り、空白 `\s` をスペース に変えてしまうのが手っ取り早いです。 ただし、このパターンには問題があり、おそらく `FOO BAR` といった物を期待されておられるかと思いますが、実はスペースが先頭や末尾に来てもマッチしてしまいます。それどころか全てスペースでもマッチします。 名前をマッチしたい場合は `^[A-Z][A-Z ]+[A-Z]` の様に先頭と末尾に必ず `[A-Z]` が入る事を確認した方がよいです。また空白が連続しない事も確認すべきです。 あと、氏名が1文字というのは考えにくいので他の条件も必要かと思います。 1文字でも良いのであれば、`^([A-Z]+)( [A-Z]+)*$` が良いかと思います。