正则表达式只接受字母和空格,并禁止字符串的开头和结尾处的空格
validation输入字段有以下要求:
- 它应该只包含字母表之间的字母和空格。
- 它不能在字符串的开头或结尾包含空格。
- 它不能包含任何其他特殊字符。
我正在使用以下正则表达式:
^(?!\s*$)[-a-zA-Z ]*$
但这在开始时允许空间。 任何帮助表示赞赏。
对我来说,唯一合乎逻辑的方法是:
^\p{L}+(?: \p{L}+)*$
在字符串的开头必须至少有一个字母。 (我将[a-zA-Z]
替换为字母\p{L}
的Unicode代码属性。 然后可以有一个空格,后跟至少一个字母,这部分可以重复。
\p{L}
:任何语言的任何一种信件。 请参阅regular-expressions.info
表达式^(?!\s*$)
是,如果只有空格直到字符串结尾 ,则前瞻将失败。 如果你想禁止前导空格,只需删除前瞻中的字符串锚点的结尾==> ^(?!\s)[-a-zA-Z ]*$
。 但是这仍然允许字符串以空格结束。 为了避免这种情况,请回头查看字符串^(?!\s)[-a-zA-Z ]*(?的结尾。 但我认为,对于这项任务,不需要环顾四周。
如果将它与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]{1}([a-zA-Z\s]*[a-zA-Z]{1})?
至少有一个字母序列,然后是带空格的可选字符串,但总是以字母结尾
我不知道你接受的字符串中的单词是否可以被多个空格分隔。 如果他们可以:
^[a-zA-Z]+(( )+[a-zA-z]+)*$
如果不能:
^[a-zA-Z]+( [a-zA-z]+)*$
字符串必须以字母(或几个字母)开头,而不是空格。
字符串可以包含很少的单词,但是第一个单词旁边的每个单词都必须有空格。
希望我帮忙。