【问题标题】:String Regex for insert text based on searchstring基于搜索字符串插入文本的字符串正则表达式
【发布时间】:2017-06-20 05:13:25
【问题描述】:

我有以下课程。

  public class TestStringRegex {

    public static void main(String[] args) {
        StringBuilder text = new StringBuilder("KALAKA");
        String wordToFind = "KA";
        Pattern word = Pattern.compile(wordToFind);
        Matcher match = word.matcher(text);

        while (match.find()) {
            System.out.println(match.end());
            text=text.insert(match.end(),"INSERT");

        }
        System.out.println(text);


    }

期望输出为 KAINSERTLAKAINSERT。 但是得到KAINSERTLAKA。 匹配器/插入是否适用于输入文本的长度?如何获得所需的输出。

【问题讨论】:

  • 试试"KALAKA".replaceAll("KA", "$0INSERT")
  • 我会避免在 StringBuilder 上重复使用匹配器,同时修改 StringBuilder。除非您有 javadoc 说这会起作用,或者确切地解释了行为是什么,否则我认为您根本不能指望它的行为是可预测的。如果您遇到无法使用replaceAll 的复杂情况,我的选择是创建一个列表,您可以在其中收集计划的编辑,然后在找到所有匹配项后查看此列表。
  • 就目前情况而言,我无法弄清楚为什么您的代码不起作用而 Mritunjay 的答案起作用。我没有看到任何关于该行为的 javadoc。我可能需要深入研究Matcher 代码才能弄清楚。
  • 我们是否需要在循环中也设置区域

标签: java regex string stringbuilder


【解决方案1】:

如果你想使用matcher 来实现它,请使用int 的重载方法,即matcher.find(index)。出于某种原因,mathcher.find() 无法按照文档中的说明工作。如果你好奇,你需要调试代码。

像下面这样说

int end = 0;
while (match.find(end)) {
    end = match.end();
    System.out.println(end);
    text=text.insert(end,"INSERT");
}

更好的方法是

public static void main(String[] args) {
    System.out.println("KALAKA".replaceAll("KA", "$0INSERT"));
}

这就是您需要编写的所有代码。

【讨论】:

  • 你能解释一下为什么这行得通而使用find() 不行吗?如果您查看findend 的javadoc,看起来两者的行为应该相同。鉴于此,我认为这种行为很可能是一个错误,并且无论如何都是不可预测的,不应该指望它。在修改 StringBuilder 时使用重复匹配似乎是个坏主意。
  • @ajb,我正在更新我的答案,我正在调试同一段代码。当我们在这行text=text.insert(end,"INSERT"); 中修改StringBuilder 时我感觉到的问题。一旦我们修改了构建器,matcher.find() 就会返回false。如果您不修改构建器并调用它两次,它就可以正常工作。
  • 是的,如果您不修改它,我希望它可以正常工作。顺便说一句,我发现差异的原因是find(end) 重置匹配器,根据javadoc,这包括重新初始化一些内部变量,包括保存开始和结束的变量搜索区域。关于为什么 OP 的代码不起作用,我仍然没有答案。查看Matcher 代码,似乎即使没有重置它也应该可以工作。
【解决方案2】:

使用 matcher.find(int startIndex) 代替 find()。并在每次匹配后更新 startIndex。完整代码:

public static void main(String[] args) {
        StringBuilder text = new StringBuilder("KALAKA");
        String wordToFind = "KA";
        Pattern word = Pattern.compile(wordToFind);
        Matcher match = word.matcher(text);

        int findIndex = 0;
        while (match.find(findIndex)) {
            int end = match.end();
            findIndex = end;
            text = text.insert(end, "INSERT");

        }
        System.out.println(text);

    }

每个下一个 find() 从上一个匹配的结尾开始

【讨论】:

  • 查看我对 Mritunjay 回答的评论。我不会推荐这个解决方案。
  • 除此之外,尝试将您的代码更改为 "INSERT""HACKATHON"。看看会发生什么!
【解决方案3】:

这很好用..!!!

public static void main(String[] args) {
    StringBuilder text = new StringBuilder("KALAKA");
    String wordToFind = "KA";
    Pattern word = Pattern.compile(wordToFind);
    Matcher match = word.matcher(text);
    int end = 0;
    while (match.find(end)) {
        end = match.end();
        text=text.insert(match.end(),"INSERT");
    }
    System.out.println(text);
}

【讨论】:

  • 您发布的代码等同于之前的两个答案。为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2023-01-13
  • 2011-07-28
  • 2017-06-10
  • 1970-01-01
  • 2019-10-17
  • 2010-10-16
相关资源
最近更新 更多