我对验证输入字段有以下要求:
但是这允许在开头有空格。非常感谢您的帮助。
- 它只能包含字母和字母之间的空格。
- 字符串开头或结尾不能包含空格。
- 它不能包含任何其他特殊字符。
^(?!\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]++)*+"
matches()
方法,那么这个正则表达式是正确的,但我仍然建议您锚定它:^([a-zA-Z]+\s+)*[a-zA-Z]+$
。 - Alan Moorematches()
方法。谢谢澄清。+1。 - nhahtdh对我来说,唯一合乎逻辑的方法是:
^\p{L}+(?: \p{L}+)*$
\p{L}:任何语言的任何类型的字母。请参见regular-expressions.info。
你表达式中的问题^(?!\s*$)
是,如果只有空格直到字符串结尾,前瞻就会失败。如果你想禁止前导空格,只需在前瞻中去除字符串结束锚点==>^(?!\s)[-a-zA-Z ]*$
。但这仍然允许字符串以空格结尾。为了避免这种情况,请在字符串末尾回溯^(?!\s)[-a-zA-Z ]*(?<!\s)$
。但我认为这个任务不需要使用环视。
)
。 - Sergey Kalinichenko[-A-Za-z]
的解决方案。只是语法让它看起来很复杂,但本质上它很简单。 - Sergey Kalinichenko^[a-zA-Z]+(\s+[a-zA-Z]+)*$
完全匹配所需的内容,而且它尽可能高效地完成了匹配。根据RegexBuddy的说法,这个正则表达式只需要22步就可以匹配字符串“Lorem ipsum tritani impedit civibus ei pri”,而你的正则表达式需要222步! - Alan Moore我认为问题在于在空格的否定之前有一个问号,这意味着它是可选的。
这应该可以工作:
[a-zA-Z]{1}([a-zA-Z\s]*[a-zA-Z]{1})?
至少一个字母序列,然后是可选的带空格的字符串,但总是以字母结尾
(?!\s*$)
是一个负向先行断言; 它断言从当前位置(由于前面的 ^
,它是字符串的开头)开始,不能匹配零个或多个空格字符,后跟字符串的结尾。那是不正确的,但不是你提出的原因。你的正则表达式将起作用,但你应该去掉 {1}
(它没有任何效果)并添加锚点。如果你碰巧使用Java的 matches()
方法,锚点是可选的,但它们有助于传达你的意图,并使将正则表达式移植到其他语言更容易。 - Alan Moore我不知道你接受的字符串中的单词是否可以用超过一个空格分隔。如果可以:
^[a-zA-Z]+(( )+[a-zA-z]+)*$
如果不能:
^[a-zA-Z]+( [a-zA-z]+)*$
字符串必须以字母(或几个字母)开头,不能有空格。
字符串可以包含几个单词,但除第一个单词外,每个单词前必须有空格。
希望我能帮到你。
<空格> <字符串> <空格> <字符串> <空格>
这样的数据,匹配应返回 false
,这就是我的正则表达式的工作原理。 - Pshemo<space>Hello World<space>
也能捕获)。 - Crazenezz