多行非终止正则表达式

时间:2017-07-07 08:36:31

标签: java regex regex-lookarounds regex-greedy regex-group

我遇到了使用正则表达式解析ASCII表中的列的问题。

想象一下如下的ASCII表:

COL1  | COL2    | COL3
======================
ONE   | APPLE   | PIE
----------------------
TWO   | APPLE   | PIES
----------------------
THREE | PLUM-   | PIES
      | APRICOT |

对于前两个条目,一个普通的捕获正则表达式完成交易

(?:(?<COL1>\w+)\s*\|\s*(?<COL2>\w+)\s*\|\s*(?<COL3>\w+)\s*)

然而,这个正则表达式捕获了标题,并且它没有捕获第3行。

我无法解决以下两个问题:

  • 如何排除标题?
  • 如何扩展COL2捕获组以捕获多行条目PLUM-APRICOT

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

有些人在面对问题时会思考   “我知道,我会使用正则表达式。”现在他们有两个问题。 (http://regex.info/blog/2006-09-15/247

我假设输入字符串如下:

it("should work", done => {
  (async () => {
    await something;
    done();
  })();
});

要拆分标题和表格,您可以使用String input = "" + "\n" + "COL1 | COL2 | COL3" + "\n" + "======================" + "\n" + "ONE | APPLE | PIE " + "\n" + "----------------------" + "\n" + "TWO | APPLE | PIES" + "\n" + "----------------------" + "\n" + "THREE | PLUM- | PIES" + "\n" + " | APRICOT | "; 。这将返回标题和表的字符串数组。

修剪表格后,您可以使用input.split("={2,}")获取表格的行。

可以使用table.split("-{2,}")将所有行转换为单元格数组。

处理多行行:在将行转换为单元格之前,您可以调用row.split("\\|")来分割多行行。 当这个拆分操作返回一个包含多个元素的数组时,它们应该在管道(row.split("\n"))上拆分,并且应该合并生成的单元格。

从这里开始,只需要元素操作即可将其转换为您想要的格式。