Androidで特殊文字を受け入れるためにユーザーを制限する正規表現が必要です。
私はこれを試しました:
!phoneNumber.matches("[/,'*:<>!~@#$%^&()+=?()\"|!\[#$-]")
true
ただし、電話番号に特殊文字が含まれているかどうかに関係なく、常に返されます。
Androidで特殊文字を受け入れるためにユーザーを制限する正規表現が必要です。
私はこれを試しました:
!phoneNumber.matches("[/,'*:<>!~@#$%^&()+=?()\"|!\[#$-]")
true
ただし、電話番号に特殊文字が含まれているかどうかに関係なく、常に返されます。
あなたの正規表現[/,'*:<>!~@#$%^&()+=?()\"|!\[#$-]
は、リストされた文字のいずれかと一度一致するため、その否定も一致します。したがって、aまたはaaまたはa!!phoneNumber.matches("[/,'*:<>!~@#$%^&()+=?()\"|!\[#$-]")
のいずれであっても true と評価されます。aaとaとして!指定された文字の1 つではありません。false と評価される場合のみ、これらの文字のいずれかが 1 回出現します。
これら以外の文字のみを受け入れる必要があります。このためには^
、文字クラスの開き括弧 ( ) の後に続けて使用し、閉じ括弧の後に[
追加する必要があります。+
この正規表現は、リストされているもの以外の任意の 1 つ以上の文字と一致します。
必要な正規表現は"[^/,'*:<>!~@#$%^&()+=?()\"|!\\[#$-]+"
、これら以外の 1 つ以上の文字を含むパターンに一致するものになります。
注:あなたの実装は Java のようです。この正規表現はJavaで機能します。
別のこと:なぜ\"
代わりに追加したの"
ですか?文字列内でエスケープする場合は"
、ただ与えるだけではなく\[
、必要\\[
だと思います。
あなたは電話番号に一致しているように見えるので(そして電話番号の非常に制限された定義)、否定的なテストではなく肯定的なテストを使用することをお勧めします:
phoneNumber.matches("[\\d\\s]+")
()-+
フィールドに数字とスペースのみが含まれている場合、これは true を返します (通常、電話番号には少なくとも.
これははるかに簡単で、すべての無効な文字をフィールドから除外します。
それを超えて、それが有効な電話番号形式であることも確認する必要があるかもしれません. それは、一致させたい電話番号の種類によって異なります。