在Java中使用正则表达式将文本文件划分为块

时间:2019-06-15 08:08:57

标签: java regex

我有一个文本文件,我需要在Java中使用正则表达式将其分成多个块。

每个块均以该行开头的数字开头,其余部分以制表符缩进。

例如:

1.  Here the block starts, and I need to capture
    all the text until the next block starts.
2.  The Second block.


3.  Another block.
        Some indented text.
4.  New block.

        More text.
            Still the 4th block.


    The end of the 4th block.

我尝试了几种模式,但是我不知道该怎么做。

我在想:

  1. 行首的数字

  2. 一些文字

  3. 行首的数字

但是这种方式(3)的数字将不会在下一场比赛中被包括,并且图案也不会抓住下一块。

3 个答案:

答案 0 :(得分:1)

您可以尝试以下正则表达式:

^\d.+?(?=^\d|\Z)

请记住使用多行和点所有选项:

Matcher m = Pattern.compile("^\\d.+?(?=^\\d|\\Z)", Pattern.MULTILINE | Pattern.DOTALL).matcher(text);
while (m.find()) {
     // m.group() is each of your blocks
}

说明:

首先要在行首(^\d)匹配一个数字,然后懒惰地匹配所有内容(.+?),直到存在(1)该行的另一个开头,然后是另一个或2)字符串的末尾((?=^\d|\Z))。

答案 1 :(得分:1)

您可能会在字符串的开头匹配1+个数字和一个点,并选择除换行符以外的任何0+次字符。

然后重复匹配以下所有不以1+数字开头且后跟点的行:

^\d+\..*(?:\r?\n(?!\d+\.).*)*

说明

  • ^字符串的开头
  • \d+\..*匹配1+个数字,后跟一个点和0+个字符(换行符除外)
  • (?:非捕获组
    • \r?\n换行符
    • (?!\d+\.)断言直接在右边的不是1+个数字,后跟一个点
    • .*匹配除换行符0次以上以外的所有字符
  • )*关闭非捕获组并重复0次以上

Regex demo | Java demo

答案 2 :(得分:0)

尝试搜索以下模式:

\d+\.\t(.*?)(?=\d+\.\t|$)

这是一个示例脚本:

List<String> blocks = new ArrayList<>();
String input = "1.\tsome content\n\tblah\n2.\tsome more content";
String pattern = "\\d+\\.\t(.*?)(?=\\d+\\.\t|$)";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = r.matcher(input);
while (m.find()) {
    blocks.add(m.group(1));
    System.out.println("LINE: " + m.group(1));
}

LINE: some content
      blah

LINE: some more content

请注意,由于给定的块可能跨越多行,因此我们使用DOTALL模式执行正则表达式搜索。