入力フィールドを検証するには、次の要件があります。
- アルファベットとアルファベット間のスペースのみを含める必要があります。
- 文字列の最初または最後にスペースを含めることはできません。
- 他の特殊文字を含めることはできません。
私はこれに次の正規表現を使用しています:
^(?!\s*$)[-a-zA-Z ]*$
しかし、これは最初にスペースを許可しています。どんな助けでも大歓迎です。
私にとってこれを行う唯一の論理的な方法は次のとおりです。
^\p{L}+(?: \p{L}+)*$
文字列の先頭には、少なくとも1つの文字が必要です。[a-zA-Z]
(私はあなたを文字のUnicodeコードプロパティに置き換えました\p{L}
)。次に、スペースの後に少なくとも1つの文字を続けることができ、この部分を繰り返すことができます。
\p{L}
:あらゆる言語からのあらゆる種類の手紙。regular-expressions.infoを参照してください
式の問題は、文字列の最後まで^(?!\s*$)
空白しかない場合、先読みが失敗することです。先頭の空白を禁止する場合は、先読み==>内の文字列アンカーの終わりを削除するだけです。ただし、これでも文字列を空白で終わらせることができます。これを回避するには、文字列の最後を振り返ります。しかし、私はこのタスクのために周りを見回す必要はないと思います。^(?!\s)[-a-zA-Z ]*$
^(?!\s)[-a-zA-Z ]*(?<!\s)$
メソッドで使用する場合、これは機能するはずですString.matches
。私はあなたが英語のアルファベットが欲しいと思います。
"[a-zA-Z]+(\\s+[a-zA-Z]+)*"
\s
あらゆる種類の空白文字を使用できることに注意してください。Javaでは、これは次のようになります。
[ \t\n\x0B\f\r]
これには、水平タブ(09)、改行(10)、キャリッジリターン(13)、フォームフィード(12)、バックスペース(08)、スペース(32)が含まれます。
特にスペース(32)のみを許可する場合:
"[a-zA-Z]+( +[a-zA-Z]+)*"
キャプチャグループを( +[a-zA-Z]+)
非キャプチャにすることで、上記の正規表現をさらに最適化できます(String.matches
とにかく単語を個別に取得することはできません)。ここでバックトラックする意味がないため、数量詞を変更して所有格にすることもできます。
"[a-zA-Z]++(?: ++[a-zA-Z]++)*+"
受け入れた文字列内の単語を複数のスペースで区切ることができるかどうかはわかりません。可能であれば:
^[a-zA-Z]+(( )+[a-zA-z]+)*$
できない場合:
^[a-zA-Z]+( [a-zA-z]+)*$
文字列は、スペースではなく、文字(または数文字)で始まる必要があります。
文字列にはいくつかの単語を含めることができますが、最初の横にあるすべての単語の前にスペースが必要です。
私が助けてくれたことを願っています。
問題はあると思いますか?空白を否定する前、つまりオプションです
これは機能するはずです:
[a-zA-Z]{1}([a-zA-Z\s]*[a-zA-Z]{1})?
少なくとも1つの文字シーケンス、次にスペースを含むオプションの文字列、ただし常に文字で終わる