验证输入字段有以下要求:
我正在使用以下正则表达式:
^(?!\s*$)[-a-zA-Z ]*$
Run Code Online (Sandbox Code Playgroud)
但这在开始时允许空间.任何帮助表示赞赏.
如果您将它与String.matches方法一起使用,这应该可行.我假设你想要英文字母.
"[a-zA-Z]+(\\s+[a-zA-Z]+)*"
Run Code Online (Sandbox Code Playgroud)
请注意,\s将允许所有类型的空白字符.在Java中,它等同于
[ \t\n\x0B\f\r]
Run Code Online (Sandbox Code Playgroud)
其中包括水平标签(09),换行(10),回车(13),成形进给(12),退格(08),空间(32).
如果您只想特别允许空格(32):
"[a-zA-Z]+( +[a-zA-Z]+)*"
Run Code Online (Sandbox Code Playgroud)
您可以通过使捕获组( +[a-zA-Z]+) 不捕获来进一步优化上面的正则表达式(String.matches无论如何您都无法单独获取单词).也可以改变量词以使它们具有占有性,因为这里的回溯没有意义.
"[a-zA-Z]++(?: ++[a-zA-Z]++)*+"
Run Code Online (Sandbox Code Playgroud)
对我来说,唯一合乎逻辑的方法是:
^\p{L}+(?: \p{L}+)*$
Run Code Online (Sandbox Code Playgroud)
在字符串的开头必须至少有一个字母.(我用[a-zA-Z]Unicode代码属性替换了你的字母\p{L}).然后可以有一个空格,后跟至少一个字母,这部分可以重复.
\p{L}:任何语言的任何一种信件.请参阅regular-expressions.info
你的表达式中的问题^(?!\s*$)是,如果只有空格直到字符串的结尾,则前瞻将失败.如果要禁止前导空格,只需在前瞻==>中删除字符串锚点的末尾^(?!\s)[-a-zA-Z ]*$.但是这仍然允许字符串以空格结束.为了避免这种情况,请回顾一下字符串的结尾^(?!\s)[-a-zA-Z ]*(?<!\s)$.但我认为,对于这项任务,不需要环顾四周.