我有一个验证客户名称的要求,在java中几乎没有条件(仅使用正则表达式验证(。客户名称将在字符串数组中,并传递给一个方法。validateCustomer(String[]名称(应该验证客户名称,并只返回数组中的有效客户名称。验证客户名称的条件如下。
- 名称只能包含字母和空格
- 每个单词都应该用空格分隔,名称不应该以空格开头或结尾
- 名字中每个单词的第一个字符应该是大写字母表
- 不允许使用特殊字符
- 名称的长度应介于2到75个字符之间
由于条件稍后可以更新,我只需要regex验证并且不使用任何其他方法,如String.length((.
我尝试了一些正则表达式,但由于某些条件而失败。试用样品
[((([A-Z][a-zA-Z])([+\s]?[A-Z][a-zA-Z]*))]{2,75}
您可以使用
^(?=[a-zA-Z\h]{2,75}$)[A-Z][a-zA-Z]*(?:\h+[A-Z][a-zA-Z]*)*$
^
字符串开始(?=[a-zA-Z\h]{2,75}$)
断言2-75个字符a-zA-Z或水平空间[A-Z][a-zA-Z]*
匹配大写字符A-Z和可选字符A-zA-Z(?:\h+[A-Z][a-zA-Z]*)*
重复前面加1个+水平空格的内容$
字符串末尾
Regex演示
如果你想要一个单独的空间:
^(?=[a-zA-Z ]{2,75}$)[A-Z][a-zA-Z]*(?: [A-Z][a-zA-Z]*)*$
Regex演示
您的正则表达式错误:
┌─ Definitely wrong!! Remove this
│ ┌─ Missing '*' to allow 1 to many words
│ │ ┌ '+' should not be allowed
│ │ │ ┌ Only space allowed, not other whitespace characters
│ │ │ │ ┌ Space is required between words, so remove '?'
│ │ │ │ │ ┌ Missing '*' to allow 1 to many words
│ │ │ │ │ │ ┌ Definitely wrong!! Remove this
│ │ │ │ │ │ │
[((([A-Z][a-zA-Z])([+\s]?[A-Z][a-zA-Z]*))]{2,75}
你想要什么:
┌─ Must be 2-75 characters long (positive lookahead)
│ ┌─ Word must be uppercase letter
│ │ ┌─ followed by 0 or more letters
│ │ │ ┌─ followed by 0 or more words separated by single space
(?=.{2,75})[A-Z][a-zA-Z]*(?: [A-Z][a-zA-Z]*)*
上述正则表达式必须与matches()
一起使用。如果要与find()
一起使用,则需要^
和$
锚。
上面的正则表达式只允许A-Z字母。要支持像ñ
这样的国际字母,请使用以下内容:
(?=.{2,75})p{Lu}p{L}*(?: p{Lu}p{L}*)*
在Java字符串文字中使用时,请记住将加倍。