首页 > 解决方案 > SwiftMessage 正则表达式

问题描述

我有以下消息:

{1:F01ANZBDEF0AXXX0509036846}{2:I103ANZBDEF0XXXXN}{4::20:TEST000001:23B:CRED:32A:141117EUR0,1:33B:EUR1000,00:50A:ANZBAU30:59:ANZBAU30:71A:SHA-}{5:{CHK:1DBBF1D81EE1}{TNG:}}

我希望它像下面那样转换,在第 4 块中有空格(即

{4: :20:TEST000001 :23B:CRED :32A:141117EUR0,1 :33B:EUR1000,00 :50A:ANZBAU30 :59:ANZBAU30 :71A:SHA -}

{1:F01ANZBDEF0AXXX0509036846}{2:I103ANZBDEF0XXXXN}{4: :20:TEST000001 :23B:CRED :32A:141117EUR0,1 :33B:EUR1000,00 :50A:ANZBAU30 :59:ANZBAU30 :71A:SHA -}{5:{CHK:1DBBF1D81EE1}{TNG:}}

我尝试使用组进行提取,然后应用正则表达式。但是,我没有成功。找不到我正在犯的错误。

public static void StringReplace() {
    String data = "{1:F01ANZBDEF0AXXX0509036846}{2:I103ANZBDEF0XXXXN}{4::20:TEST000001:23B:CRED:32A:141117EUR0,1:33B:EUR1000,00:50A:ANZBAU30:59:ANZBAU30:71A:SHA-}{5:{CHK:1DBBF1D81EE1}{TNG:}}";

    Pattern pat = Pattern.compile("(({1:\\w+})({2:\\w+})({4::\\d+:\\w+:\\d+.:\\w+:\\d+.:\\d+\\w+,\\d:\\d+.:\\w+,\\d+:\\d+.:\\w+:\\d+:\\w+:\\d+.:\\w+-})({5:{\\w+:.\\w+}{\\w+.}}))");

    Matcher m = pat.matcher(data);

    if(m.matches()) {
        System.out.println(m.group(0));
    }
}

提前感谢

标签: javaregex

解决方案


您刚刚匹配了字符串并简单地打印了它,但没有在两者之间引入空格的逻辑。您需要在第 4 块中添加引入空间的逻辑。

查看块 4 的预期输出,您可以首先使用此正则表达式捕获块 4,

(.*?)(\\{4.*?\\})(.*?)

然后在第 2 组内容中将冒号替换为空格冒号(:),您将其称为块 4。我看到您并没有在每个冒号中引入空格,而只是为冒号,后跟 2-3 个字符,后跟冒号。我已经在我的replaceAll()方法中相应地实现了逻辑。

这是修改后的java代码,

public static void StringReplace() {
    String data = "{1:F01ANZBDEF0AXXX0509036846}{2:I103ANZBDEF0XXXXN}{4::20:TEST000001:23B:CRED:32A:141117EUR0,1:33B:EUR1000,00:50A:ANZBAU30:59:ANZBAU30:71A:SHA-}{5:{CHK:1DBBF1D81EE1}{TNG:}}";

    Pattern pat = Pattern.compile("(.*)(\\{4.*?\\})(.*)");
    Matcher m = pat.matcher(data);

    if (m.find()) {
        String g1 = m.group(1);
        String g2 = m.group(2).replaceAll(":(?=\\w{2,3}:)", " :");
        String g3 = m.group(3);
        System.out.println(g1 + g2 + g3);
    } else {
        System.out.println("Didn't match");
    }
}

这将按您的预期打印以下输出,

{1:F01ANZBDEF0AXXX0509036846}{2:I103ANZBDEF0XXXXN}{4: :20:TEST000001 :23B:CRED :32A:141117EUR0,1 :33B:EUR1000,00 :50A:ANZBAU30 :59:ANZBAU30 :71A:SHA-}{5:{CHK:1DBBF1D81EE1}{TNG:}}

推荐阅读