Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么图案/匹配器两次找到一个匹配项_Java_Regex - Fatal编程技术网

Java 为什么图案/匹配器两次找到一个匹配项

Java 为什么图案/匹配器两次找到一个匹配项,java,regex,Java,Regex,我想在StringBuilder结果中找到标记,并在其href属性之前插入单词INSERTED-word/ 代码: 但有些标记被发现两次或两次以上,并且在它们的href属性之前插入了两次或两次以上的INSERTED-WORD/ 例如,我想找到这个标签: link 然后把它改成 link 。 但这段代码将其更改为 链接< /a> 如何修复它?您看到的行为是由使用indexOf引起的。当某个内容被多次找到时,indexOf将搜索相同的匹配字符串,并始终返回第一个匹配的索引 这不是代码的唯一问题。您还

我想在StringBuilder结果中找到标记,并在其href属性之前插入单词INSERTED-word/

代码:

但有些标记被发现两次或两次以上,并且在它们的href属性之前插入了两次或两次以上的INSERTED-WORD/

例如,我想找到这个标签:

link

然后把它改成

link

。 但这段代码将其更改为

链接< /a>


如何修复它?

您看到的行为是由使用indexOf引起的。当某个内容被多次找到时,indexOf将搜索相同的匹配字符串,并始终返回第一个匹配的索引

这不是代码的唯一问题。您还可以在matcher使用结果时对其进行修改,java的matcher并没有设计来处理这个问题,也无法正常工作。一个明显的问题是,它会认为结果比实际情况要短,可能还有其他问题

以下内容将修复您的代码:

Pattern pattern = Pattern.compile("<a [a-zA-Z0-9=\":.;\\s&%_#/\\\\()\\-']*href=['\"]");
Matcher matcher = pattern.matcher(result.toString()); // Create new String instead of using result
int found = 0;
while (matcher.find()) {
    int index2 = matcher.end();
    result.insert(index2 + found++ * "INSERTED-WORD/".length(), "INSERTED-WORD/");
}       
我将把它留给您去弄清楚为什么需要find,在没有它的情况下运行代码,看看会发生什么

笔记 这不是解决问题的好方法anubhava在他的评论中提供了一个简单得多的解决方案:result=newStringBuilderResult.toString.replaceAll是一个好方法。
输入是什么?result.indexOfmatcher.group0看起来字符串总是插入到使用正则表达式解析HTML的第一次出现中,这很容易出错。如果必须这样做,请使用:str=str.replaceAll]*?href=\?!INSERTED-WORD/,$0 INSERTED-WORD/;添加负前瞻?!INSERTED-WORD结束模式:要排除插入到已处理的URL中:Pattern.compilee为什么不使用XML API,这将非常简单?您的代码无法正常工作。但是我将使用jsoup。Thanks@AtefehRashidi这取决于您的输入和正则表达式。在您提供的示例中,它肯定会起作用。很好,您决定使用jsoup。
Pattern pattern = Pattern.compile("<a [a-zA-Z0-9=\":.;\\s&%_#/\\\\()\\-']*href=['\"]");
Matcher matcher = pattern.matcher(result.toString()); // Create new String instead of using result
int found = 0;
while (matcher.find()) {
    int index2 = matcher.end();
    result.insert(index2 + found++ * "INSERTED-WORD/".length(), "INSERTED-WORD/");
}