我需要一个正则表达式模式用于名称字段,其中我希望允许字符a-z、a-z和'-和空白。我目前正在使用这段代码,但它给出了一个错误。
final String regexpattern = "/[a-zA-Zs-']*/";
您必须在s
之前添加另一个,并为匹配开始和结束添加
^
和$
。
final String regexpattern = "/^[a-zA-Z\s'-]*$/";
您的正则表达式(当它不再格式错误时-请参阅下面的修复方法)将始终匹配,因为您不使用锚点(^
-字符串的开头,$
-字符串的结尾),也不使用*
量词(匹配与前面的子模式匹配的一个或多个符号,尽可能多)。
但是,仅仅添加^
和$
并不能修复模式,因为您在C字符串中使用了带有s
的1个反斜杠(即在字符串文字"…"中)。该反斜杠被视为转义符号,不被考虑在内,因为"s"
是无效的转义序列。在正则表达式(即[...]
)中的字符类中,连字符创建范围。您的s-'
创建了一个从s
(十进制代码115)到'
(十进制代码39)的范围。由于在字符类内的范围内,代码必须从最低到最高,因此会引发错误。
你可以只使用
final String regexpattern = "/^[a-zA-Z\s-']*$/";
这是可能的,因为简写类s
后面的连字符不会创建范围,而是被视为文字。作为最佳实践,您可以像xdazz那样将其移动到角色类的末尾。
关于您在评论中的附加问题:
我必须允许除
^<>%*()#!?
之外的所有字符
只需使用一个否定的字符类:一对方括号,里面有一个起始^
:
final String regexpattern = "/^[^<>%*()#!^?]*$/";
1 2 3
这里,第一个^
是字符串锚的开始,第二个插入符号是字符类内字符的否定。第三个插入符号是文字符号^
。