以下 Java 正则表达式“似乎”正在工作。目的是删除 escapeChar-反斜杠"\"
。那就是"\\{"
应该成为"{"
。
我的问题是
- 正则表达式字段中的 10 个字符不是 - 右括号“)” - 关闭从 char5 开始的正则表达式组吗?那么这对 char10 的右括号后的字符如何工作?
有人可以为我分解这个正则表达式吗?
str = str.replaceAll("\\\\([{}()\\[\\]\\\\!&:^~-])", "$1");
删除逃逸后,我们剩下
\\([{}()\[\]\\!&:^~-])
^character class
这里字符类中的所有内容都是文字,除了[
,]
并且\
已被转义。
正则表达式字段中的 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
),它将整个匹配项(反斜杠 + 字符)替换为字符本身。
换句话说,这会从这些特殊字符中删除前导反斜杠。