我需要构建一个regex模式来验证Java中的String。因此,我构建了一个模式[A-Z][a-z]*\s?[A-Z]?[a-z]*$来满足以下条件:
[A-Z][a-z]*\s?[A-Z]?[a-z]*$
Pattern.matches("[A-Z][a-z]*\s?[A-Z]?[a-z]*$","Joe V")在java中为me返回false,但对于regexr.com中的数据“Joe V”,同样的模式返回true。原因可能是什么?
Pattern.matches("[A-Z][a-z]*\s?[A-Z]?[a-z]*$","Joe V")
false
ffscu2ro1#
Javascript本身支持regex,而Java不支持。由于Java使用\来表示字符串中的特殊符号(如\n),因此必须将\转义为\符号。这是通过另一个\来完成的。因此,在Java中使用的任何\都应写成\\。因此,您的regex / code应该是:
\
\n
\\
Pattern.matches("[A-Z][a-z]*\\s?[A-Z]?[a-z]*$", "Joe V")
返回trueP.s. \s在任何Java字符串中都被解释为空格
true
\s
yqyhoc1h2#
您可以使用
Pattern.matches("[A-Z][a-z]*(?:\\s[A-Z][a-z]*)*","Joe V") Pattern.matches("\\p{Lu}\\p{Ll}*(?:\\s\\p{Lu}\\p{Ll}*)*","Joe V")
参见regex demo #1和regex demo #2。请注意,.matches需要完整的字符串匹配,因此在测试站点上使用了^和$锚点,而在代码中没有它们。
.matches
^
$
[A-Z]
\p{Lu}
[a-z]*
\p{Ll}*
(?:\s[A-Z][a-z]*)*
(?:\s\p{Lu}\p{Ll}*)*
[A-Z][a-z]*
\p{Lu}\p{Ll}*
2条答案
按热度按时间ffscu2ro1#
Javascript本身支持regex,而Java不支持。由于Java使用
\
来表示字符串中的特殊符号(如\n
),因此必须将\
转义为\
符号。这是通过另一个\
来完成的。因此,在Java中使用的任何\
都应写成\\
。因此,您的regex / code应该是:
返回
true
P.s.
\s
在任何Java字符串中都被解释为空格yqyhoc1h2#
您可以使用
参见regex demo #1和regex demo #2。
请注意,
.matches
需要完整的字符串匹配,因此在测试站点上使用了^
和$
锚点,而在代码中没有它们。^
-字符串的开头(在.matches
中隐含)[A-Z]
/\p{Lu}
-(Unicode)大写字母[a-z]*
/\p{Ll}*
-零个或多个(Unicode)小写字母(?:\s[A-Z][a-z]*)*
/(?:\s\p{Lu}\p{Ll}*)*
-零个或多个序列\s
-一个空格[A-Z][a-z]*
/\p{Lu}\p{Ll}*
-一个大写(Unicode)字母,然后是零个或多个(Unicode)小写字母。$
-字符串结尾(在.matches
中隐含)