【问题标题】:Is there any way in java to selectively escape few special charactersjava中有没有办法选择性地转义几个特殊字符
【发布时间】:2017-01-31 07:27:05
【问题描述】:

我有一个存储在文本文件中的模式,我正在从文件中读取并使用该模式来匹配字符串。

示例:/abc/def[\d]/ghi

现在我希望它应该与 /abc/def[1]/ghi/abc/def[2]/ghi 匹配

如果我使用 Pattern.quote("/abc/def[\d]/ghi"),它会将整个输入视为字面量,因此只有匹配的字符串是 "/abc/def[\d] /ghi"

所以我必须将模式保存在像 /abc/def\[\d\]/ghi 这样的文件中,这样我就失去了可读性。

有什么方法可以专门转义几个字符,比如我希望 '\d' 具有特殊含义,但不希望 '[]' 具有特殊含义。

【问题讨论】:

  • 一个简单的解决方案可能会出现问题:假设匹配字符串/abc[\d]/def[\d]/ghi 第一个[\d\] 应该被视为文字,而第二个应该被视为字符组。你怎么知道的?

标签: java regex


【解决方案1】:

为了获得所需的匹配,您的模式必须看起来像

\[\d\]

最后。但是为了使内容更具可读性,请考虑使用方法来构建此类模式表达式,而不是将它们硬编码为文字,例如:

String encloseInSquareBrackets(String pattern) {
  return "\[" + pattern + "]";
}

...
String pattern = "/abc/def" + encloseInSquareBrackets("\d")+ "/ghi";

例如。是的,这意味着要阅读更多文本,但是假设您花了一些时间想出好的方法名称,这会使您的模式定义更易于阅读/理解。

甚至可以更进一步,创建一些“RegexBuilder”类,提供一组不错的此类方法;允许流畅的界面。

【讨论】:

    【解决方案2】:

    转义括号:

    /abc/def\[\d\]/ghi
    

    更新:

    为避免输入文件中的括号转义,可以在读取后转义:

    public String escapeSquareBrackets(String e) {
        return e.replaceAll("([\\[\\]])", "\\$1");
    }
    

    【讨论】:

    • 我也给出了这个答案。直到我意识到他已经知道了。他发现这种模式难以阅读,并询问是否可以用其他方式表达。
    • 而且错误,他使用了 java 标签。您的源代码看起来一点也不像 java。
    • 我会重命名该方法 - 它不会转义所有内容 - 它只是转义方括号。更糟糕的是——这种方法可能很危险。您必须记住永远不要将它与包含“真实组”的模式一起使用。还是投了赞成票。
    • 嗯,有时赢得声誉是一项艰巨而严肃的工作;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多