在java中使用regex和在javascript中使用regex有什么区别吗?

jtw3ybtb  于 2022-11-18  发布在  Java
关注(0)|答案(2)|浏览(95)

我需要构建一个regex模式来验证Java中的String。因此,我构建了一个模式[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。
原因可能是什么?

ffscu2ro

ffscu2ro1#

Javascript本身支持regex,而Java不支持。由于Java使用\来表示字符串中的特殊符号(如\n),因此必须将\转义为\符号。这是通过另一个\来完成的。因此,在Java中使用的任何\都应写成\\
因此,您的regex / code应该是:

Pattern.matches("[A-Z][a-z]*\\s?[A-Z]?[a-z]*$", "Joe V")

返回true
P.s. \s在任何Java字符串中都被解释为空格

yqyhoc1h

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 #1regex 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中隐含)

相关问题