1

以下 Java 正则表达式“似乎”正在工作。目的是删除 escapeChar-反斜杠"\"。那就是"\\{"应该成为"{"

我的问题是

  1. 正则表达式字段中的 10 个字符不是 - 右括号“)” - 关闭从 char5 开始的正则表达式组吗?那么这对 char10 的右括号后的字符如何工作?
  2. 有人可以为我分解这个正则表达式吗?

    str = str.replaceAll("\\\\([{}()\\[\\]\\\\!&:^~-])", "$1");
    
4

2 回答 2

3

删除逃逸后,我们剩下

  \\([{}()\[\]\\!&:^~-])
     ^character class

这里字符类中的所有内容都是文字,除了[,] 并且\已被转义。

于 2012-11-14T23:43:58.067 回答
3

正则表达式字段中的 10 个字符不是 - 右括号“)” - 关闭从 char5 开始的正则表达式组吗?那么这对 char10 的右括号后的字符如何工作?

不。括号,两者(都不)是字符类中的元字符。请注意,在字符类中,只有这些字符^-[]\具有特殊含义。

在插入符号 ( ^) 和破折号 ( -) 的情况下,如果策略性地放置在 char 类中,它们将失去其特殊含义:插入符号如果放置在除开头之外的任何位置,-如果它放置在开头结尾。

有人可以为我分解这个正则表达式吗?

让我们去掉 Java 需要的双重转义,变成\\\\([{}()\\[\\]\\\\!&:^~-])

\\([{}()\[\]\\!&:^~-])   # the actual regex

其中分解为:

\\                   # match literal backslash
 (                   # open capture group
  [                  # open character class, matching any of
   {}()\[\]\\!&:^~-  # these characters: {}()[]\!&:^~-
  ]                  # close character class
 )                   # close capture group

基本上它说:匹配一个反斜杠,后跟这些字符之一{}()[]\!&:^~-,并将其​​放入捕获组。此捕获组用于替换 ( $1),它将整个匹配项(反斜杠 + 字符)替换为字符本身。

换句话说,这会从这些特殊字符中删除前导反斜杠。

于 2012-11-14T23:50:07.780 回答