在Java正则表达式转义特殊字符在Java正则表达式转义特殊字符(Escaping special

2019-05-14 09:16发布

有没有在Java中的任何方法或转义(未引用)的特殊字符(元字符),为了使用它作为一个正则表达式的任何开源库?

这将是动态构建一个正则表达式非常方便,无需手动逃避每个个性。

例如,考虑一个简单的regex像\d+\.\d+与一个小数点像匹配数1.2 ,以及如以下代码:

String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");

Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);

System.out.println("Regex 1: " + regex1);

if (numbers1.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}

System.out.println("Regex 2: " + regex2);

if (numbers2.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}

不足为奇的是,由上面的代码所产生的输出是:

Regex 1: \d+\.\d+
    Match
Regex 2: \Qd+.d+\E
    No match

也就是说, regex1匹配1.2 ,但regex2 (这是“动态的”建)不(相反,它的文字字符串匹配d+.d+ )。

那么,有没有会自动跳脱每个正则表达式元字符的方法?

如果有,比方说,一个静态escape()的方法java.util.regex.Pattern ,输出

Pattern.escape('.')

将字符串"\."

Pattern.escape(',')

应该只是生产"," ,因为它不是一个元字符。 同样的,

Pattern.escape('d')

可以产生"\d" ,因为'd'被用来表示数字(尽管逃逸可能无法在此情况下是有意义的,如'd'可能意味着字面'd' ,其将不会被正则表达式interpeter被误解为别的东西,如将与情况'.' )。

Answer 1:

有没有在Java中的任何方法或转义(未引用)的特殊字符(元字符),为了使用它作为一个正则表达式的任何开源库?

我不是100%肯定这是你问这里。 如果你正在寻找一种方法来创建,你可以在你的正则表达式的使用模式则只是前面加上他们与常量"\\"应该工作,但没有很好的Pattern.escape('.')功能,以帮助这一点。

所以,如果你想匹配"\\d" (字符串\d不是十进制字符的),那么你会怎么做:

// this will match on \d as opposed to a decimal character
String matchBackslashD = "\\\\d";
// as opposed to
String matchDecimalDigit = "\\d";

4个斜线Java字符串在变成2条斜线在正则表达式模式。 2个反斜杠在正则表达式模式反斜杠本身相匹配。 前面加上反斜线任何特殊字符把它变成一个正常的字符,而不是一个特殊的一个。

matchPeriod = "\\.";
matchPlus = "\\+";
matchParens = "\\(\\)";
... 

在您的文章使用Pattern.quote(string)方法 。 你可能知道,这个包装之间的模式"\\Q""\\E"这样你就可以匹配,即使它恰好有一个特殊的正则表达式字符在一个字符串( +.\\d等)



Answer 2:

我写了这个模式:

Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[{}()\\[\\].+*?^$\\\\|]");

并在此方法使用它:

String escapeSpecialRegexChars(String str) {

    return SPECIAL_REGEX_CHARS.matcher(str).replaceAll("\\\\$0");
}

然后你可以这样使用它,例如:

Pattern toSafePattern(String text)
{
    return Pattern.compile(".*" + escapeSpecialRegexChars(text) + ".*");
}

我们需要做,因为,后逃逸,我们增加了一些正则表达式的表达式。 如果没有,你可以简单地使用\Q\E

Pattern toSafePattern(String text)
{
    return Pattern.compile(".*\\Q" + text + "\\E.*")
}


Answer 3:

正则表达式匹配知道你正在寻找一个数字,不信的唯一途径d是逃避字母( \d )。 在Java中键入正则表达式转义字符,你需要逃脱它(这样\变成\\ )。 因此,有各地的特殊字符的正则表达式输入双反斜线没有办法。



Answer 4:

格雷同意,因为您可能需要您的模式有两种litrals(\ [\])和元字符([,])。 所以用一些工具,你应该能够逃脱首先所有的字符,然后你可以添加你想在相同的模式添加元字符。



Answer 5:

使用

pattern.compile("\"");
String s= p.toString()+"yourcontent"+p.toString();

将给出结果作为yourcontent原样



Answer 6:

使用这个工具功能escapeQuotes()为了逃避字符串和一个之间RegualrExpression

正则表达式字面的列表逃脱<([{\^-=$!|]})?*+.>

public class RegexUtils {
    static String escapeChars = "\\.?![]{}()<>*+-=^$|";
    public static String escapeQuotes(String str) {
        if(str != null && str.length() > 0) {
            return str.replaceAll("[\\W]", "\\\\$0"); // \W designates non-word characters
        }
        return "";
    }
}

模式类反斜杠字符('\')用于引入转义结构。 字符串常量"\(hello\)"是非法的,并导致编译时错误; 为了字符串匹配字符串(你好)字面"\\(hello\\)"必须被使用。

例如 :String要匹配(hello) ,并用一组正则表达式是(\(hello\)) 形成在这里你只需要逃避匹配的字符串,如下图所示。 Test Regex online

public static void main(String[] args) {
    String matched = "(hello)", regexExpGrup = "(" + escapeQuotes(matched) + ")";
    System.out.println("Regex : "+ regexExpGrup); // (\(hello\))
}


文章来源: Escaping special characters in Java Regular Expressions