如何使用java正则表达式识别第4个字符

时间:2014-09-08 11:11:39

标签: 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")

第一个字符串工作正常。但对于第二个字符串,它将替换字符串XYZ(最后一次出现),后面没有第5个分号。这里如何将搜索限制为5.以上正则表达式试图匹配分号5及以上的XYZ我猜。 注意:每个分号之间的数据长度是可变的。有人可以帮我吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

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

.替换为[^;]以匹配;以外的任何字符,并在开头添加^,以强制匹配{{1}从一开始:

String

答案 1 :(得分:2)

您需要指定锚^,它表示起点。

正则表达式:

^((?:[^;]*;){5})XYZ

替换字符串:

$1ABC

DEMO

String s = " aisozp;ak  apso;;   ;pasix acd;XYZ;ao aoz;;  ;aixi o  oiz\n" + 
        " aisozp;ak  apso;;XYZ;pasix acd;098;ao aoz;;  ;XYZ; as oiz";
String m = s.replaceAll("^((?:[^;]*;){5})XYZ", "$1ABC");
System.out.println(m);

输出:

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