【问题标题】:Java Regex replaceAll() with lookaheadJava 正则表达式 replaceAll() 与前瞻
【发布时间】:2013-08-31 06:34:10
【问题描述】:

我对在 java 中使用正则表达式相当陌生。我的动机是用反斜杠转义所有出现的“*”。 这是我尝试过的声明:

String replacementStr= str.replaceAll("(?=\\[*])", "\\\\");

这似乎不起作用。经过一番修修补补,发现这是可行的。

String replacementStr= str.replaceAll("(?=[]\\[*])", "\\\\");

根据我对正则表达式的了解,我认为 '[]' 代表一个空字符类。我在这里错过了什么吗?有人可以帮我理解一下吗?

注意:我试用的目的是学习使用正则表达式的前瞻功能。虽然问题中所述的目的不保证使用前瞻,但我只是试图将其用于教育目的。抱歉没有说清楚!

【问题讨论】:

  • 为什么要使用前瞻?这对我来说没有意义。

标签: java regex lookahead


【解决方案1】:

当某些元字符放在括号内时,无需转义。

另外,我不知道你的意思是不是用\* 转义*。在这种情况下,请尝试下一个:

String newStr = str.replace("*", "\\*");

编辑:你的正则表达式有些奇怪。

  • (?=\[*]) 向前看字符[(0 次或多次),然后是]

  • (?=[]\[*]) 向前看下一个字符之一:[]*

也许您正在寻找的正则表达式如下:

(?=\*)

在 Java 中,"(?=\\*)"

【讨论】:

  • 感谢您的快速回答。虽然这肯定符合所述目的,但我试图理解前瞻正则表达式,但我仍然不知道为什么第二个语句可以正常工作,而第一个语句不能。
  • java.util.regex.PatternSyntaxException:在索引 0 * 附近悬空元字符 '*'
  • @aarthi_ram 希望更新能给你一些帮助。祝你好运!
【解决方案2】:

在您的replaceAll("(?=\\[*])", "\\\\"); 中只需修改为

String newStr = str.replace("*", "\\");

不要在意正则表达式

例如

String str = "abc*123*";
String newStr = str.replace("*", "\\");
System.out.println(newStr);

显示输出为

abc\123\

了解String replace

【讨论】:

  • java.util.regex.PatternSyntaxException:在索引 0 * 附近悬空元字符 '*'
  • @Prateek 查看修改后的答案
【解决方案3】:

下面的代码可以工作

代码

String strTest = "jhgfg*gfb*gfhh";
strTest = strTest.replaceAll("\\*", "\\\\"); //   strTest = strTest.replace("*", "\\");
System.out.println("String is : "+strTest);

输出

String is : jhgfg\gfb\gfhh

【讨论】:

    【解决方案4】:

    如果正则表达式引擎找到[],它会将] 视为文字]。这从来都不是问题,因为空字符类无论如何都没用,这意味着您可以避免一些字符转义。

    对于字符类中不必转义的字符有一些规则:

    • [](或[^])中,] 是文字
    • [-.....][^-.....][.....-][^.....-] 中,- 是文字
    • ^ 是字面量,除非它位于字符类的开头

    所以如果你不想的话,你永远不需要逃避 ]-^

    这取决于正则表达式语法的 Perl 起源。这是一种非常 Perl 风格的做事方式。

    【讨论】:

      猜你喜欢
      • 2012-06-22
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多