这个Java正则表达式如何替换转义字符?

这个Java正则表达式如何替换转义字符?,java,regex,Java,Regex,下面的Java正则表达式似乎正在工作。其目的是删除escapeChar-反斜杠\。也就是说,\{应该变成{ 我的问题是 regex字段中的10个字符(右括号)不是正在关闭从char5开始的regex组吗?那么,在char10的右括号之后的字符是如何工作的呢? 有人能帮我把这个正则表达式分解一下吗 str = str.replaceAll("\\\\([{}()\\[\\]\\\\!&:^~-])", "$1"); 拆除逃生梯后,我们剩下的是 \\([{}()\[\]\\!&

下面的Java正则表达式似乎正在工作。其目的是删除escapeChar-反斜杠\。也就是说,\{应该变成{

我的问题是

regex字段中的10个字符(右括号)不是正在关闭从char5开始的regex组吗?那么,在char10的右括号之后的字符是如何工作的呢? 有人能帮我把这个正则表达式分解一下吗

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

拆除逃生梯后,我们剩下的是

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

这里character类中的所有内容都是文本,除了[,]和\已经转义。

删除转义后,我们剩下

  \\([{}()\[\]\\!&:^~-])
     ^character class
这里字符类中的所有内容都是文字,除了已转义的[,]和\之外

regex字段中的10个字符(右括号)不是正在关闭从char5开始的regex组吗?那么,在char10的右括号之后的字符是如何工作的呢

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

在插入符号^和破折号的情况下,如果将它们战略性地放在char类中,它们将失去其特殊的意义:如果插入符号不放在开头,那么它将失去其特殊的意义;如果插入符号放在开头或结尾,那么它将失去其特殊的意义

有人能帮我把这个正则表达式分解一下吗

让我们删除Java所需的双转义,它将\\\[{}\\\[\]\\\\\!&:^~-]转换为:

分为:

\\                   # match literal backslash
 (                   # open capture group
  [                  # open character class, matching any of
   {}()\[\]\\!&:^~-  # these characters: {}()[]\!&:^~-
  ]                  # close character class
 )                   # close capture group
基本上它是这样写的:匹配一个反斜杠,后跟这些字符中的一个{}[]\!&:^~-,并将其放入一个捕获组中。这个捕获组用于替换$1,它用字符本身替换整个匹配反斜杠+字符

换句话说,这将删除这些特殊字符的前导反斜杠

regex字段中的10个字符(右括号)不是正在关闭从char5开始的regex组吗?那么,在char10的右括号之后的字符是如何工作的呢

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

在插入符号^和破折号的情况下,如果将它们战略性地放在char类中,它们将失去其特殊的意义:如果插入符号不放在开头,那么它将失去其特殊的意义;如果插入符号放在开头或结尾,那么它将失去其特殊的意义

有人能帮我把这个正则表达式分解一下吗

让我们删除Java所需的双转义,它将\\\[{}\\\[\]\\\\\!&:^~-]转换为:

分为:

\\                   # match literal backslash
 (                   # open capture group
  [                  # open character class, matching any of
   {}()\[\]\\!&:^~-  # these characters: {}()[]\!&:^~-
  ]                  # close character class
 )                   # close capture group
基本上它是这样写的:匹配一个反斜杠,后跟这些字符中的一个{}[]\!&:^~-,并将其放入一个捕获组中。这个捕获组用于替换$1,它用字符本身替换整个匹配反斜杠+字符



换句话说,这将删除这些特殊字符的前导反斜杠。

人们说正则表达式不可读?结尾的笑脸很有趣。答案是:regexp太糟糕了。如果它们有任何不寻常的嵌套,请在REs中使用空格和注释。@millimoose它很难看,因为你不能在Ja中使用原始字符串va,但在其他方面也没那么糟糕。@NullUserException Java的RE引擎允许使用该标志。当RE的行特别嘈杂或不明显时,使用它是一个非常好的主意。人们说正则表达式不可读?结尾的笑脸很有趣。答案是:regexp很糟糕。如果有的话,请在REs中使用空格和注释有点不寻常的嵌套。@millimoose它很难看,因为Java中不能有原始字符串,但在其他方面也没那么糟糕。@NullUserException Java的RE引擎允许使用该标志。当RE的行特别嘈杂或不明显时,使用它是一个非常好的主意。您只删除了一层字符串escapes@SamIam这可能就是问题的关键所在RE,而不是Java中必须跳转的环,因为它没有逐字字符串或RE文本。@SamIam我删除了字符串双引号删除的部分。其他的是reg-ex的一部分。如果我错了,请纠正我。@millimoose Cthulhu是对的,答案中剩余的反斜杠是reg-ex的一部分。除了[和]已经转义了…还有反斜杠本身。您只移除了一层escapes@SamIam这可能就是问题所在。要获得RE,您必须在Java中跳转,而不是跳转,因为它没有逐字字符串或RE文本。@SamIam我删除了字符串双引号删除的部分。其他部分是注册表的一部分x、 如果我错了,请纠正我。@millimoose Cthulhu是对的,答案中剩余的反斜杠是正则表达式的一部分。除了已转义的[and]和反斜杠本身……换句话说,这将从特殊的characters@NullUserException-Tha
非常感谢你。这很有帮助。。。。换句话说,这将从那些特殊的characters@NullUserException-非常感谢。这很有帮助。