8

我对验证输入字段有以下要求:

  1. 它应该只包含字母和字母之间的空格。
  2. 它不能在字符串的开头或结尾包含空格。
  3. 它不能包含任何其他特殊字符。

我为此使用以下正则表达式:

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

但这在开始时允许空格。任何帮助表示赞赏。

4

5 回答 5

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 回答
8

对我来说,这样做的唯一合乎逻辑的方法是:

^\p{L}+(?: \p{L}+)*$

在字符串的开头必须至少有一个字母。(我用[a-zA-Z]字母的Unicode代码属性替换了你的\p{L})。然后可以有一个空格后跟至少一个字母,这部分可以重复。

\p{L}: 任何语言的任何类型的字母。请参阅正则表达式.info

您的表达式中的问题是,如果在 string 末尾^(?!\s*$)只有空格,那么前瞻将失败。如果您想禁止前导空格,只需删除前瞻 ==> 内的字符串锚的结尾。但这仍然允许字符串以空格结尾。为避免这种情况,请查看字符串的末尾。但我认为这项任务不需要环顾四周。^(?!\s)[-a-zA-Z ]*$^(?!\s)[-a-zA-Z ]*(?<!\s)$

于 2012-05-22T09:34:36.173 回答
1

我认为问题是有一个?在否定空格之前,这意味着它是可选的

这应该有效:

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

至少一个字母序列,然后是带有空格但总是以字母结尾的可选字符串

于 2012-05-22T09:10:15.933 回答
1

我不知道您接受的字符串中的单词是否可以用一个以上的空格分隔。如果他们可以:

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

如果不能:

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

字符串必须以字母(或几个字母)开头,而不是空格。

字符串可以包含几个单词,但 first 旁边的每个单词前面都必须有空格。

希望我有所帮助。

于 2012-05-22T11:48:00.717 回答
1

尝试这个:

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

此表达式使用负前瞻负后瞻来禁止字符串开头或结尾的空格,并要求匹配整个字符串。

于 2012-05-22T08:55:28.753 回答