【问题标题】:Best way to search for a special string in a text在文本中搜索特殊字符串的最佳方法
【发布时间】:2023-04-10 15:26:01
【问题描述】:

如果我有一段大约 3000 个字符的文本。我想搜索具有某些特征的字符串,例如 [*] 这样的字符串。

也就是我想从

得到[a][bc]
sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]

我知道有一种叫做 KMP 的算法可以保证通过文本进行线性时间搜索操作,但是在这里我没有找到固定的字符串,也许我必须在某个地方使用一些正则表达式。

我怎样才能比 O(n^2) 做得更好?如果我使用 java,是否有任何轻量级库?

【问题讨论】:

    标签: java string algorithm search text


    【解决方案1】:

    不需要库,您已经有效地描述了正则表达式的用例!它们针对搜索进行了高度优化,在本例中为O(n)

    String str = "sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]";
    List<String> allMatches = new ArrayList<>();
    Matcher m = Pattern.compile("\\[[^\\]]*]").matcher(str);
    while (m.find()) {
        allMatches.add(m.group());
    }
    

    Regex Demo

    如果你有任何疑问并且真的想要一些你可以看到的 O(n),这里有一个算法:

    String str = "sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]";
    List<String> allMatches = new ArrayList<>();
    for (int i = str.indexOf('['), j; i != -1; i = str.indexOf('[', j + 1)) {
        j = str.indexOf(']', i + 1);
        // if `j` is -1, the brackets are unbalanced. Perhaps throw an Exception?
        allMatches.add(str.substring(i, j + 1));
    }
    

    【讨论】:

      【解决方案2】:

      以下是如何在一行中做到这一点:

      String[] hits = str.replaceAll("^.*?\\[|][^\\]]*$", "").split("].*?\\[");
      

      这通过剥离前导和尾随字符直到并包括第一个/最后一个打开/关闭方括号,然后在一个右括号上拆分到下一个左括号(包括)。

      【讨论】:

      • 不错!你确定性能?惰性量词似乎可以改进。
      • @4castle 性能?我的猜测是这将在大约 10 微秒内执行,这“足够快”。但也要考虑开发人员的表现。更少的代码意味着更少的错误和更少的编写时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2013-06-25
      • 2014-03-23
      相关资源
      最近更新 更多