使用java替换所有出现的特定模式前面的字符串

时间:2014-09-03 02:39:37

标签: java regex

我已经通过堆栈溢出发布了各种问题以获得我的问题的解决方案,但我找不到完全匹配。因此问这个。

我的模式如下:

    :20: LAIDKZPABCL90165LZJABC
    :90: LZ,90509LAOABCXL,XKPA;AOLZ
    :90C: KDOLASABC9080690ABD
    :90D: ABDBABC906AODIPALKD
    :90L: AND9011112XXXADABC
    :90: AKLZPDOAMXNA,;POAS

在上面的字符串中,我必须将所有(或至少第一个)字符串“ABC”的出现替换为“XYZ”,其前面是“:90C:”或“:90D:”。我有以下解决方案,取代第一次出现工作正常。

    String data; // Let data be the string as mentioned above
    Pattern pat = Pattern.compile("(:9(0(C|D)):).*?ABC");
    StringBuffer buf = new StringBuffer(data);
    int endIndex = -1;
    Matcher matcher = pat.matcher(buf2);
    System.out.println(buf.toString());
    while(matcher.find()){
        endIndex = matcher.end();
        buf.replace(endIndex-3, endIndex, "XYZ");

    }
    System.out.println(buf.toString());

我在这里得到了正确的结果。它取代了第一次出现的“ABC”和“XYZ”,其前面是:90C:或:90D:。

有没有精确的解决方案来实现这一目标?我无法使用lookbehind,因为我不确定ABC在数据中的位置。需要解决方案,如果可能的话,替换所有(前面是:90C:或:90D:使用正则表达式。我认为替换所有是不可能的,我想,因为我们不确定边界。请帮助我。

提前致谢

1 个答案:

答案 0 :(得分:1)

你可以试试下面使用lookahead的正则表达式

(?=:90C:|:90D:)(.*?)ABC(\\S+)

只需将匹配的字符替换为$1XYZ$2

DEMO