如何转义特殊的正则表达式字符?

时间:2020-06-02 08:54:54

标签: java regex

我在Java中遇到了一个问题,特定于String.split函数。 我正在将C#代码移植到Java,这使Java感到困扰。我的C#代码如下:

foreach (char sep in separators)
    if (text.Contains(sep.ToString()))
        array = text.Reverse().Split(sep);

Reverse()是我自己做的扩展,它只是反转一个字符串。 separators是一个char数组,其中包含一些分隔符:

char[] separators = { '&', '!', '#', '?', '%' };

现在,在Java中,我的代码如下:

for (char sep : separators) {
    String sepp = String.valueOf(sep);
    if (text.contains(sepp))
        array = new StringBuilder(text).reverse().toString().split(sepp);
}

此代码的问题是,当我有特定的分隔符?(它是随机选择的)时,它将抛出此错误(仅Java):

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
at java.base/java.util.regex.Pattern.error(Pattern.java:2027)
at java.base/java.util.regex.Pattern.sequence(Pattern.java:2202)
at java.base/java.util.regex.Pattern.expr(Pattern.java:2068)
at java.base/java.util.regex.Pattern.compile(Pattern.java:1782)
at java.base/java.util.regex.Pattern.<init>(Pattern.java:1428)
at java.base/java.util.regex.Pattern.compile(Pattern.java:1068)
at java.base/java.lang.String.split(String.java:2317)
at java.base/java.lang.String.split(String.java:2364)
at com.anerruption.encryption.Main.decrypt(Main.java:58)
at com.anerruption.encryption.Main.main(Main.java:43)

我的猜测是C#中的函数string.Split不使用Regex,而Java中的则使用Regex。从我所听到的,我需要逃脱角色。做\\?无效。我该怎么办?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用这种方式,只需将"\\"方法的split()连接到每个分隔符即可

char[] separators = { '&', '!', '#', '?', '%' };

for (char sep : separators) {
    if (text.contains(sep+""))
       array = new StringBuilder(text).reverse().toString().split("\\"+sep);
}

答案 1 :(得分:1)

元字符说明.........................................转义字符< / p>

*   zero or more occurrence of the characters        \\*
+   one or more occurrence of the characters         \\+ 
?   zero or only one occurrence of the characters    \\? 
^   Start of the character sequence                  \\^
$   End of the character sequence                    \\$

?的例子

 public static void main(String[] args) {
    // TODO Auto-generated method stub
    String[] separators = { "&", "!", "#", "\\?", "%" };
    String str = "Parth?Prem";
    String str2 = "\\?";
    String[] strArray;

    strArray = str.split(str2);

    System.out.println("Given String : " + str);
    for(int i=0;i<strArray.length;i++) {
        System.out.println("strArray["+i+"] = " + strArray[i]);
    }
    
}

输出:

给出字符串:Parth?Prem

strArray [0] = Parth

strArray [1] = Prem