如何在 Java 中拆分包含特殊字符 `}`、`/`、`-` 和 `{` 的字符串
How to split a string with special characters `}`, `/`, `-` and `{` in Java
我一直在关注话题 How to split a string in Java 并且成功了。
但在当前用例中,我正在处理的 String
包含特殊字符。
我有一个 String
作为 https://{domain name}/{type of data}/4583236-{name-of-perpetrators}
,我想从中提取 4583236
。
QA 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)
split
的参数是一个正则表达式。因此,您需要转义正则表达式中使用的特殊字符,例如 {
。 {}
用于表示正则表达式中的重复,因此出现错误 Illegal repetition
.
String[] suburl = mySuburl.split("-\{name-of-perpetrators");
如果您不希望 split
的参数是正则表达式,请使用建议的 Pattern.quote
to avoid escaping as 。
String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));
尝试使用 Pattern.quote
来避免一个字符一个字符地转义,它会免费为您完成:
String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));
对于像查找包含在另一个字符串中的文字字符串这样简单的事情,实际上没有理由使用像正则表达式模式这样复杂的东西。
使用 indexOf
和 substring
就足够了:
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));
显然,如果在任何时候输入文本可能不完全是这种格式,那么这种方法可能会失败,例如通过使 start
或 end
变量为负数。如果是这种情况,您应该检查并妥善处理。
我一直在关注话题 How to split a string in Java 并且成功了。
但在当前用例中,我正在处理的 String
包含特殊字符。
我有一个 String
作为 https://{domain name}/{type of data}/4583236-{name-of-perpetrators}
,我想从中提取 4583236
。
QA 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)
split
的参数是一个正则表达式。因此,您需要转义正则表达式中使用的特殊字符,例如 {
。 {}
用于表示正则表达式中的重复,因此出现错误 Illegal repetition
.
String[] suburl = mySuburl.split("-\{name-of-perpetrators");
如果您不希望 split
的参数是正则表达式,请使用建议的 Pattern.quote
to avoid escaping as
String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));
尝试使用 Pattern.quote
来避免一个字符一个字符地转义,它会免费为您完成:
String[] suburl = mySuburl.split(Pattern.quote("-{name-of-perpetrators"));
对于像查找包含在另一个字符串中的文字字符串这样简单的事情,实际上没有理由使用像正则表达式模式这样复杂的东西。
使用 indexOf
和 substring
就足够了:
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));
显然,如果在任何时候输入文本可能不完全是这种格式,那么这种方法可能会失败,例如通过使 start
或 end
变量为负数。如果是这种情况,您应该检查并妥善处理。