这个正则表达式语法在 Java 中的实际含义是什么?

What does this regex syntax actually mean in Java?

我写了一个程序来检测回文。它适用于我所拥有的,但我偶然发现了另一种语法,我想知道它到底是什么意思?

这是我正在使用的代码行:

    userString = userString.toLowerCase().replaceAll("[^a-zA-Z]", "");

我知道 replaceAll 代码片段意味着 "match characters ([...]) that are not (^) in the range a-z and A-Z (a-zA-Z)."

然而,这也有效:

    replaceAll("[^(\p{L}')]", "");

我只是不明白如何将其翻译成英文。我对正则表达式完全陌生,但我发现它们非常吸引人。感谢任何能告诉我这是什么意思的人。

两个正则表达式不一样:

  • [^a-zA-Z] 匹配非英文字母的任何字符
  • [^(\p{L}')] 匹配任何字符而不是字母、引号或括号

即第二个也删除了括号和引号。

正则表达式 \p{L} 是 "any letter" 的 posix 字符 class。 IE 这两个正则表达式仅在英文字母的上下文中是等效的:

  • [a-zA-Z]
  • \p{L}

你应该检查这个网站: https://regex101.com

当我 writing/testing/debugging 一些正则表达式时,它对我帮助很大 ;)

给出如下解释:

[^(\p{L}')] 匹配下表中不存在的单个字符:

  • ( 文字字符 (
  • \p{L} 匹配来自任何语言的任何类型的字母
  • ') 列表中的单个字符 ') 字面意思