如何使用java正则表达式识别字符的第四次出现

如何使用java正则表达式识别字符的第四次出现,java,regex,string,Java,Regex,String,我有两条像这样的线 aisozp;ak apso;; ;pasix acd;XYZ;ao aoz;; ;aixi o oiz aisozp;ak apso;;XYZ;pasix acd;098;ao aoz;; ;XYZ; as oiz 这里我需要用ABC替换字符串XYZ,只有当它位于第5到第6个分号(;)之间时。 为了达到这个目的,我尝试了以下方法 data.replaceAll("(((.*?);){5})XYZ", "$1ABC") 它与第一根弦配合得很好。但是对于

我有两条像这样的线

 aisozp;ak  apso;;   ;pasix acd;XYZ;ao aoz;;  ;aixi o  oiz
 aisozp;ak  apso;;XYZ;pasix acd;098;ao aoz;;  ;XYZ; as oiz
这里我需要用ABC替换字符串XYZ,只有当它位于第5到第6个分号(;)之间时。 为了达到这个目的,我尝试了以下方法

 data.replaceAll("(((.*?);){5})XYZ", "$1ABC")
它与第一根弦配合得很好。但是对于第二个字符串,它将替换字符串XYZ(最后一次出现),该字符串后面没有第五个分号。这里介绍如何将搜索限制为5。上面的正则表达式试图匹配分号5以上的XYZ。 注意:每个分号之间的数据长度是可变的。有人能帮我吗


提前谢谢。

这是因为
*
中的
匹配任何字符,包括

替换为
[^;]
以匹配除
以外的任何字符
,并在开头添加一个
^
,以强制从一开始匹配
字符串

data.replaceAll("^((([^;]*?);){5})XYZ", "$1ABC")

您需要指定表示起点的锚点
^

正则表达式:

^((?:[^;]*;){5})XYZ
替换字符串:

$1ABC

输出:

 aisozp;ak  apso;;   ;pasix acd;ABC;ao aoz;;  ;aixi o  oiz
 aisozp;ak  apso;;XYZ;pasix acd;098;ao aoz;;  ;XYZ; as oiz

FWIW,您可能希望使内部组不被捕获。非常感谢您的帮助非常感谢您的帮助
 aisozp;ak  apso;;   ;pasix acd;ABC;ao aoz;;  ;aixi o  oiz
 aisozp;ak  apso;;XYZ;pasix acd;098;ao aoz;;  ;XYZ; as oiz