我需要将章节标题拆分为标题编号和标题名称。章节标题的格式为:
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'
...
答案 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);