Java-用正则表达式替换所有,然后替换字符串的第一个出现

Java-用正则表达式替换所有,然后替换字符串的第一个出现,java,regex,replace,Java,Regex,Replace,我有一个包含HTML的字符串:我想保留的东西… 我正在使用正则表达式将替换为(,然后将下面的替换为) Pattern regex=Pattern.compile(“]*title=(['\“])(.*?\\1[^>]*>”; Matcher Matcher=regex.Matcher(strLine); if(matcher.find()){ strLine=matcher.replaceAll(“”); 斯特林=斯特林。替换(“,”); } 我可以工作,但它会替换所有的标记;我只想替换与我刚

我有一个包含HTML的字符串:
我想保留的东西…

我正在使用正则表达式将
替换为
,然后将下面的
替换为

Pattern regex=Pattern.compile(“]*title=(['\“])(.*?\\1[^>]*>”;
Matcher Matcher=regex.Matcher(strLine);
if(matcher.find()){
strLine=matcher.replaceAll(“”);
斯特林=斯特林。替换(“,”);
}

我可以工作,但它会替换所有的
标记;我只想替换与我刚匹配的开始标记匹配的标记。

我建议您使用一个正则表达式来匹配整个
。在一个组中捕获
,在另一个组中捕获
,然后使用捕获组进行替换。

我建议您使用一个正则表达式来匹配整个
..
。在一个组中捕获
,在另一个组中捕获
,并使用捕获组进行替换。

您可以尝试提取
标记的内容,然后用大括号将其包裹起来,而不是替换
标记对于
标记,您可以尝试提取
标记的内容,然后用大括号将其括起来。

为什么不在一个
replaceAll(…)
调用中执行此操作:

String s = "noise <span title=\"whatever\">something I want to preserve</span>...";
s = s.replaceAll("<span\\s+[^>]*title=(['\"])(.*?)\\1[^>]*>(.*?)</span>", "($3)");
System.out.println(s);
编辑
请注意Alan在我的回答下的评论:这假设您的输入中没有嵌套的

为什么不在一个
replaceAll(…)
调用中执行此操作:

String s = "noise <span title=\"whatever\">something I want to preserve</span>...";
s = s.replaceAll("<span\\s+[^>]*title=(['\"])(.*?)\\1[^>]*>(.*?)</span>", "($3)");
System.out.println(s);
编辑
注意Alan在我的回答下的评论:这假设您的输入中没有嵌套的

您是否尝试过
替换
而不是
替换所有
?因此,如果我理解正确,您需要用(),但任何没有标题的跨距都会被忽略。您在上面遇到的问题是,开头标记被正确替换,但结尾标记被替换的太多(即,与没有标题的开头标记匹配的那些。这是否正确?您是否尝试过用
replace
而不是
replaceAll
?因此,如果我理解正确,您需要用(),但任何没有标题的跨距都会被忽略。您在上面遇到的问题是,开头标记被正确替换,但结尾标记被替换的太多(即,与没有标题的开头标记相匹配的元素。这是否正确?这假设在匹配的元素中不会嵌套任何其他
元素。这假设在匹配的元素中不会嵌套任何其他
元素。
noise (something I want to preserve)...