Java正则表达式模式匹配器用重复替换组

Java正则表达式模式匹配器用重复替换组,java,html,regex,pattern-matching,replaceall,Java,Html,Regex,Pattern Matching,Replaceall,我有下面的场景, 我需要改变 <a href="ab/xyz" onclick="ab/123"></a> 上面的代码只替换每个标记的一个属性值,即使我的正则表达式中有repeation操作符,并且我正在执行ReplaceAll 如果我将“If”条件更改为while循环,那么它将更改所有属性,基本上每个迭代一个属性 有没有一种方法可以在没有循环的情况下替换所有属性值中的所有匹配项 解决方案:即使没有重复操作符,一个哑正则表达式也在做这件事。问题是我匹配了整个标记。它只替

我有下面的场景, 我需要改变

<a href="ab/xyz" onclick="ab/123"></a>
上面的代码只替换每个标记的一个属性值,即使我的正则表达式中有repeation操作符,并且我正在执行ReplaceAll

如果我将“If”条件更改为while循环,那么它将更改所有属性,基本上每个迭代一个属性

有没有一种方法可以在没有循环的情况下替换所有属性值中的所有匹配项


解决方案:即使没有重复操作符,一个哑正则表达式也在做这件事。问题是我匹配了整个标记。

它只替换了一次出现,因为结尾处的
*
匹配了整个stirng的长度(好吧,直到最后一次
,但最有可能是文档的结尾,因为它将以
html>
)结尾,并且后面没有其他匹配

Java支持lookaheads和lookbehinds,我们需要它们来实现它。基本上,前瞻告诉Java“只有在匹配后面跟有whater时才匹配,但whater不是匹配本身的一部分”。落后的人都是一样的,只是比赛之前必须做的事。不幸的是,Java不支持
*
+
内部lookbehinds,因此它们有点棘手,但应该可以工作:

([^>]*?="[^"]*?)ab(?=[^<]*>)
([^>]*?=“[^”]*?)ab(?=[^)
将其替换为
$1pq

我对它进行了测试,它可以工作-但在每个属性(第一个)中只替换一个
ab
。如果在一个属性中有多个
ab
s,并且所有属性都应该被替换,我看不出有任何方法(没有适当的向后看)


请注意,这是假设有效的HTML-它可能会在无效的HTML上产生意外的结果。

使用matcher.replaceAll(“ab”、“pq”);(也可以是just Replace,一段时间没有使用过)@Boyen这只在你有办法首先获得所有属性的情况下才有效,否则你会替换页面中的任何ab,而不仅仅是属性值内的ab。因为OP似乎在整个源代码中使用了regexp(当然这不是最好的性能操作,但这可能是有原因的),没那么简单。是的,我没想到。@Cfreak完全不相关。这也不应该验证或解析HTML,RexExps在Java中的实现方式也不等于计算机科学所理解的“正则表达式”(请参阅您链接到的问题的第一条评论)。我这样做了,但仍然是一样的,没有while循环,它在htmlIt中每个标记只更改1个属性,原因也是一样的。regexp匹配整个标记。它只在第一次匹配后查找其他匹配项。您需要lookaheads和lookbehinds才能使其工作-但我不确定Javascript是否支持这些。如果它不支持,则存在不可能。(您的原始代码应该只替换每页一个标记,而不是每个标记一个)呃…这意味着是Java,autocorrect做到了;)不用担心,我正在寻找正确的语言;)
(<[^>]+)((=")(ab)([^>/"]*"))+([^>].*>)
if(matcher.find())
matcher.ReplaceAll($1$3pq$4$5)
([^>]*?="[^"]*?)ab(?=[^<]*>)