如何在Java中拆分带有特殊字符`}`,`/`,`-`和`{`的字符串

时间:2018-01-09 14:01:31

标签: java string split special-characters

我一直关注线程How to split a string in Java并且已经成功。

但在当前的用例中,我正在处理的String包含特殊字符。

我的Stringhttps://{domain name}/{type of data}/4583236-{name-of-perpetrators},我想从中提取4583236

质量保证How to split the string using '^' this special character in java?或多或少与我之前提到过的问题有关,但对我的用例没有帮助。

我的程序会在任意一个特殊字符上随机投放 PatternSyntaxException: Illegal repetition

代码块:

    String current_url = "https://{domain name}/{type of data}/4583236-{name-of-perpetrators}";
    String[] urlParts = current_url.split("type of data}/");
    String mySuburl = urlParts[1];
    String[] suburl = mySuburl.split("-{name-of-perpetrators");
    String mytext = suburl[0];
    System.out.println(mytext);

错误堆栈跟踪:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition
{name-of-perpetrators
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.closure(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at demo.TextSplit.main(TextSplit.java:18)

3 个答案:

答案 0 :(得分:3)

尝试使用Pattern.quote以避免逐个字符转义,它会为您免费提供:

String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));

答案 1 :(得分:2)

split的论据是正则表达式。因此,您需要转义正则表达式中使用的特殊字符,如{{}用于表示正则表达式中的重复,因此表示错误Illegal repetition

String[] suburl = mySuburl.split("-\\{name-of-perpetrators");

如果您不希望split的参数成为正则表达式,请使用Pattern.quote以避免转义为@YCF_L

String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));

答案 2 :(得分:1)

对于像查找另一个字符串中包含的文字字符串这样简单的事情,实际上没有理由使用像正则表达式一样复杂的东西。

使用indexOfsubstring就足够了:

String text = "https://{domain name}/{type of data}/4583236-{name-of-perpetrators}";
String searchStart = "{type of data}/";
String searchEnd = "-{name-of-perpetrators}";
int start = text.indexOf(searchStart) + searchStart.length();
int end = text.indexOf(searchEnd, start);

String expected = "4583236";
assertEquals(expected, text.substring(start, end));

显然,如果输入文本在任何时候可能都没有这种格式,那么这种方法可能会失败,例如将startend变量设为负数。如果是这种情况,您应该检查并妥善处理。