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

gau*_*ott 7 java regex

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

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

我正在使用以下正则表达式:

^(?!\s*$)[-a-zA-Z ]*$
Run Code Online (Sandbox Code Playgroud)

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

nha*_*tdh 8

如果您将它与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)

  • 如果你正在使用Java的`matches()`方法,请更正,但无论如何我会锚定它:`^([a-zA-Z] +\s +)*[a-zA-Z] + $` (3认同)

ste*_*ema 8

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

^\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)$.但我认为,对于这项任务,不需要环顾四周.