【问题标题】:Most efficient way to get the substring after a specific other substring在特定的其他子字符串之后获取子字符串的最有效方法
【发布时间】:2016-02-19 00:04:45
【问题描述】:

如果我有一个看起来像这样的字符串:

String text = "id=2009,name=Susie,city=Berlin,phone=0723178,birthday=1991-12-07";

我只想知道namephone 的信息。我知道如何解析整个字符串,但在我的具体情况下,只获取这两个“字段”很重要。

那么让我的搜索方法执行以下操作的最佳/最有效方法是什么:

搜索子字符串“name=”并返回其后的子字符串(“Susie”),直到它到达下一个逗号

我的方法是:

  1. 获取"name=" first 的最后一个索引
  2. 然后使用此索引作为我的解析方法的新起点

关于如何更有效地使用更简洁的代码完成此操作,还有其他建议吗?感谢您的任何意见

【问题讨论】:

  • 使用split。如果您确实遇到性能问题,请进行基准测试。
  • 使用PatternMatcher 仅捕获name=phone= 之后的内容
  • ,分割,由=分割,循环第一个数组并检查索引0处的第二个分割项是否等于您正在搜索的内容并返回下一个splittet 数组以及循环中的当前索引之一是索引1

标签: java regex string parsing substring


【解决方案1】:

您可以使用以下正则表达式捕获phonename 之后的预期单词,并从匹配对象中获取第一个组:

(?:phone|name)=([^,]+)

关于以下命令,如果它可能碰巧有一个包含phonename 的单词,作为更全面的方式,您可以在您的名字前加上逗号。

(?:^|,)(?:phone|name)=([^,]+)

阅读更多关于正则表达式http://www.regular-expressions.info/

【讨论】:

  • 导致此正则表达式中断的一个极端情况是存在以“name”或“phone”结尾的字段,例如“user_name”和“cell_phone”。
  • 好的,有人能告诉我如何在代码中使用这个正则表达式吗? (抱歉,我知道基础知识,但这看起来有点太高级了......)
  • @mattforsythe 是的,检查编辑。感谢您的关注。
  • 现在你有另一个极端情况:当“电话”或“姓名”是字符串中的第一对时,它就不起作用了。 :) 我想你想要的是(?:^|,)(?:phone|name)=([^,]+)
  • @lilisyn 由于这一点,您没有提供任何代码,所以不是代码编写服务,我只是给出了这个答案作为提示,您可以搜索正确的 java 函数或方法找出所有符合这个模式的案例。
【解决方案2】:

Regex 可能更高效,但为了可读性,我 Guava

    String text = "id=2009,name=Susie,city=Berlin,phone=0723178,birthday=1991-12-07";

    final Map<String, String> infoMap = Splitter.on(",")
            .omitEmptyStrings()
            .trimResults()
            .withKeyValueSeparator("=")
            .split(text);

    System.out.println(infoMap.get("name"));
    System.out.println(infoMap.get("birthday"));

【讨论】:

    猜你喜欢
    • 2012-09-16
    • 2019-03-03
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多