我有以下文字:

abcabcabcabc<2007-01-12><name1><2007-01-12>abcabcabcabc<name2><2007-01-11>abcabcabcabc<name3><2007-02-12>abcabcabcabc<name4>abcabcabcabc<2007-03-12><name5><date>abcabcabcabc<name6>

我需要使用正则表达式来清理上面的文本:

基本提取规则是:

<2007-01-12>abcabcabcabc<name2>

我没有问题提取此模式。我的问题是,在文本中,我的序列格式错误:如果文本不是以日期开头,而以名称结尾,则提取失败。例如,上面的文本可能有几个错误的格式序列,例如:

abcabcabcabc<2007-01-12><name1>

应该:

<2007-01-12>abcabcabcabc<name1>

在提取我的一致模式之前,是否可以使用正则表达式清除上面的内容。简而言之,我需要找到所有格式错误的格式,然后按照上面的示例中的说明,将日期标签放在其前面。

谢谢。

最佳答案

您是否需要类似的东西?

public class Extract {
    public static void main(String[] args) {
        String text =
            "abcabcabcabc<2007-01-12><name1>" +
            "<2007-01-12>abcabcabcxxx<name2>" +
            "<2007-01-11>abcabcabcyyy<name3>" +
            "<2007-02-12>abcabcabczzz<name4>" +
            "abcabcabc123<2007-03-12><name5>" +
            "<date>abcabcabc456<name6>";
        System.out.println(
            text.replaceAll(
                "(text)<(text)>(text)<(text)>"
                    .replace("text", "[^<]*"),
                "$1$3 - $2 - $4\n"
            )
        );
    }
}


打印:

abcabcabcabc - 2007-01-12 - name1
abcabcabcxxx - 2007-01-12 - name2
abcabcabcyyy - 2007-01-11 - name3
abcabcabczzz - 2007-02-12 - name4
abcabcabc123 - 2007-03-12 - name5
abcabcabc456 - date - name6


本质上,包含3个部分:


裸文本由\1\3捕获-其中之一应为空字符串
日期是\2
名称是\4


当然,您也可以使用Matcher并提取单个group

参考文献


regular-expressions.info/Grouping

10-06 09:42