正则表达式分裂章节标题

时间:2013-08-21 19:13:11

标签: java regex split

我需要将章节标题拆分为标题编号和标题名称。章节标题的格式为:

some long text
    3.7.2 sealant durability 
     paragraph with text        // (.*)
    3.7.3 funkční schopnost
     paragraph with text...
    3.1.13 plastic sealant xx 21    
     paragraph with text
    3.1.14 plastic sealant 
    xx 21   
     paragraph with text
    3.7.12 sealant durability
     paragraph with text
    3.7.325 funkční schopnost

修改 问题在于,ilustrated值介于长文本之间,充满了特殊字符。

我曾经遵循过代码,但它只分裂了最后一个点后的最后一位数字。当我在最后一个“\ d”后填写“+”字符时,会抛出错误。这个问题的正确表达式是什么?

title.trim().split("(?<=(\\d\\.\\d{1,2}\\.[\\d]))")

预期产出:

splitedValue[0] : '3.7.2'
splitedValue[1] : 'sealant durability'
...
splitedValue[0] : '3.1.14'
splitedValue[1] : 'plastic sealant xx 21'
...

enter image description here

4 个答案:

答案 0 :(得分:4)

有没有理由你不能indexOf(' ')找到第一个空白字符,然后在两边都是子字符串?对于您和在五年内查看代码时,这可能更容易使用。

答案 1 :(得分:2)

使用 split 不太适合您的情况,而不是使用带有数字和标题组的预编译regexp。以下是解析测试用例的代码段:

public static void main(String[] args) {
    Pattern pattern = Pattern.compile("([\\d\\.]+)\\s+(.*)", Pattern.MULTILINE | Pattern.DOTALL);

    List<String> input = Arrays.asList(
            "3.7.2 sealant durability",
            "3.7.3 funkční schopnost",
            "3.1.14 plastic sealant xx 21",
            "3.1.14 plastic sealant\n" +
                    "xx 21",
            "3.7.12 sealant durability",
            "3.7.325 funkční schopnost");

    for (String s : input) {
        Matcher matcher = pattern.matcher(s);
        System.out.println("Input:" + s);
        if (matcher.matches()) {
            System.out.println("Number: " + matcher.group(1));
            System.out.println("Title: '" + matcher.group(2)+"'");
        }
        System.out.println();
    }
}

答案 2 :(得分:1)

您可以尝试使用正则表达式:

 *(\d+(\.\d+)*) (\p{L}+( \p{L}+)*)

\p{L}表示Unicode字母的类别。另外,你需要使用Pattern的常量来避免每次都重新编译表达式,如下所示:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile(" *(\\d+(\\.\\d+)*) (\\p{L}+( \\p{L}+)*)");

public static void main(String[] args) {
    String input = "    3.7.2 sealant durability \n     paragraph with text        // (.*)\n    3.7.3 funkční schopnost\n     paragraph with text...\n    3.1.13 plastic sealant xx 21    \n     paragraph with text";

    Matcher matcher = REGEX_PATTERN.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group(1)); // Chapter
        System.out.println(matcher.group(3)); // Title
    }
}

使用matcher.find()代替split()

输出:

3.7.2
sealant durability
3.7.3
funkční schopnost
3.1.13
plastic sealant xx

答案 3 :(得分:0)

正如@EricStein指出的那样,找到第一个空格是个好主意。你也可以尝试一些稍微灵活的东西:

String name = "3.7.2 sealant durability";
System.out.println(name.split("\\s+", 2)[1]);
sealant durability

更一般地说,为了匹配您的预期输出:

String[] splitedValue = name.split("\\s+", 2);