正则表达式只接受字母和空格,并禁止字符串的开头和结尾处的空格

时间:2012-05-22 08:49:51

标签: java regex

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

  1. 它应该只包含字母表之间的字母和空格。
  2. 它不能在字符串的开头或结尾包含空格。
  3. 它不能包含任何其他特殊字符。
  4. 我正在使用以下正则表达式:

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

    但这开头就是允许空格。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分: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]++)*+"

答案 1 :(得分:8)

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

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

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

\p{L}:来自任何语言的任何类型的信件。见regular-expressions.info

表达式^(?!\s*$)中的问题是,如果只有空格直到字符串结尾,则前瞻将失败。如果你想禁止前导空格,只需删除前瞻中的字符串锚点的末尾==&gt; ^(?!\s)[-a-zA-Z ]*$。但是这仍然允许字符串以空格结束。为了避免这种情况,请回顾字符串^(?!\s)[-a-zA-Z ]*(?<!\s)$的末尾。但我认为,对于这项任务,不需要环顾四周。

答案 2 :(得分:1)

试试这个:

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

此表达式使用negative lookahead and negative lookbehind来禁止字符串开头或结尾处的空格,并要求匹配整个字符串。

答案 3 :(得分:1)

我认为问题在于?在否定白色空格之前,这意味着它是可选的

这应该有效:

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

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

答案 4 :(得分:1)

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

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

如果不能:

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

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

字符串可以包含很少的单词,但是第一个单词旁边的每个单词都必须有空格。

希望我帮助过。