8

入力フィールドを検証するには、次の要件があります。

  1. アルファベットとアルファベット間のスペースのみを含める必要があります。
  2. 文字列の最初または最後にスペースを含めることはできません。
  3. 他の特殊文字を含めることはできません。

私はこれに次の正規表現を使用しています:

^(?!\s*$)[-a-zA-Z ]*$

しかし、これは最初にスペースを許可しています。どんな助けでも大歓迎です。

4

5 に答える 5

8

私にとってこれを行う唯一の論理的な方法は次のとおりです。

^\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)$

于 2012-05-22T09:34:36.173 に答える
8

メソッドで使用する場合、これは機能するはずです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]++)*+"
于 2012-05-22T08:53:47.860 に答える
1

これを試して:

^(((?<!^)\s(?!$)|[-a-zA-Z])*)$

この式は、負の先読みの後読みを使用して、文字列の最初または最後のスペースを禁止し、文字列全体の一致を要求します。

于 2012-05-22T08:55:28.753 に答える
1

受け入れた文字列内の単語を複数のスペースで区切ることができるかどうかはわかりません。可能であれば:

^[a-zA-Z]+(( )+[a-zA-z]+)*$

できない場合:

^[a-zA-Z]+( [a-zA-z]+)*$

文字列は、スペースではなく、文字(または数文字)で始まる必要があります。

文字列にはいくつかの単語を含めることができますが、最初の横にあるすべての単語の前にスペースが必要です。

私が助けてくれたことを願っています。

于 2012-05-22T11:48:00.717 に答える
1

問題はあると思いますか?空白を否定する前、つまりオプションです

これは機能するはずです:

[a-zA-Z]{1}([a-zA-Z\s]*[a-zA-Z]{1})?

少なくとも1つの文字シーケンス、次にスペースを含むオプションの文字列、ただし常に文字で終わる

于 2012-05-22T09:10:15.933 に答える