【问题标题】:How to split a string with special characters `}`, `/`, `-` and `{` in Java如何在Java中使用特殊字符`}`、`/`、`-`和`{`分割字符串
【发布时间】:2018-01-09 14:01:30
【问题描述】:

我一直在关注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)

【问题讨论】:

  • 为什么不在“/”上拆分,然后选择正确的起点。在那里你可以(更)轻松地提取数值。
  • @Stultuske 感谢您的建议。但是与/- 拆分不会打印任何内容。
  • 其实不需要拆分几次。两个indexOfsubstring 更好,可能性能更高。
  • @M.Prokhorov 我错过了你的建议。可以举个例子吗?

标签: java string split special-characters


【解决方案1】:

尝试使用Pattern.quote 避免逐个字符转义,它会免费为您做到这一点:

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

【讨论】:

  • Pattern.quote("-{name-of-perpetrators") 似乎很出色!!!非常感谢。
【解决方案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"));

【讨论】:

  • split("-\\{name-of-perpetrators"); 非常完美!!!非常感谢您的精彩解释。
【解决方案3】:

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

使用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 变量设为负数。如果是这种情况,您应该检查并妥善处理。

【讨论】:

  • 谢谢。毫无疑问的好主意。但我不会知道期望值到底是多少。因此我的问题是如何提取数字。
  • 我不清楚你在问什么。使用索引调用substring 确实会从初始文本中提取正确的数字,如测试所示您还想知道什么?如何将String 转换为数字?
猜你喜欢
  • 2022-10-07
  • 2019-11-03
  • 1970-01-01
  • 2022-08-11
  • 2019-03-19
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多