【问题标题】:Why Java replaceAll() using regular expression need to add "\\" at front? [duplicate]为什么Java replaceAll() 使用正则表达式需要在前面添加“\\”? [复制]
【发布时间】:2020-12-30 15:40:04
【问题描述】:

对于输入字符串 id,我想做如下 4 个步骤:

  1. 删除所有非小写字母、数字、“-”、“_”、“.”
  2. 如果“.”是多个连续的,将其替换为单个“。” (例如:他......llo -> he.llo)
  3. 如果字符串以“.”开头,请将其删除。
  4. 如果字符串以“.”结尾,请将其删除。

这是我的代码的 4 行:

id = id.replaceAll("[^" + "a-z" + "0-9" + "-" + "_" + "." + "]", "");
id = id.replaceAll(".{2,}",".");
id = id.replaceAll("^.","");
id = id.replaceAll(".$","");

我发现规则 2 的返回将是“。” (例如:他...llo -> 。) 规则 3,4 将删除不是“.”的字符串

所以我修复了如下代码:

id = id.replaceAll("[^" + "a-z" + "0-9" + "-" + "_" + "." + "]", "");
id = id.replaceAll("\\.{2,}",".");
id = id.replaceAll("\\^.","");
id = id.replaceAll("\\.$","");

而且效果很好。 我只是不明白。该正则表达式是否需要在使用前添加两次“\”? 如果它是正确的,为什么规则 1 工作得很好?谁能给我具体的正确答案? 最后,我想知道我可以同时编码规则 3 和规则 4 吗?喜欢使用 && 吗?

【问题讨论】:

  • . 在正则表达式的上下文中具有特殊含义。因此,如果我们想匹配文字点,我们必须对其进行转义。单个反斜杠是不够的,因为这是 java 字符串的转义字符,我们需要正则表达式中的文字反斜杠-String,我们可以使用 \`. Same goes for ^` 和 $ 获得。 --- 备注:我想id = id.replaceAll("\\^.",""); 应该是id = id.replaceAll("^\\.","");

标签: java regex replaceall


【解决方案1】:
  • 正则表达式中的. 表示“匹配任何单个字符”
  • \. 在正则表达式中的意思是“匹配单个点/句点/句号字符”。编写此代码的另一种方式是 [.],它具有相同的最终结果,但语义不同(我不确定这是否会对匹配表达式的生成代码产生负面影响)
  • [abc.] 在正则表达式中的意思是“匹配必须是 'a' 或 'b' 或 'c' 或 '.' 的单个字符”([^…] 反转含义:匹配任何 not)。注意:- 在字符类中具有特殊含义,因此如果要专门匹配连字符,请确保始终将其放在首位或最后。

至于为什么要复制反斜杠:Java 本身使用反斜杠来转义字符串中的字符。要将文字反斜杠作为字符串的一部分,您必须对反斜杠本身进行转义:"\\" 是包含单个反斜杠字符的字符串("\" 在 Java 中是语法错误,因为反斜杠转义了以下引号,即字符串永远不会终止)。

要将您的逻辑减少到两个 replaceAll 调用,我建议更改调用的顺序,然后使用 | 运算符加入您的表达式作为替代:

id = id.replaceAll(".+", ".") // fold all dots
        .replaceAll("[^a-z0-9_.-]|^\\.|\\.$", "");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多