2017-07-07 86 views
-1

我遇到了正则表达式在ASCII表中解析列的问题。多行非终止正则表达式

想像这样一个ASCII表:

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

对于第2项微不足道的捕获正则表达式做交易

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

然而,这正则表达式捕捉头,以及它不捕获第三条线。

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

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

感谢您的帮助!

+2

嗯,不要用正则表达式吗? – Aaron

+1

最好是在逐行阅读时跳过第一行,阅读其他内容并用'\\ s * \\ | \\ s *“分开# –

+0

@Aaron更好地使用Bison? ;) – calaedo

回答

1

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

我假定输入字符串,如:

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")来拆分多行记录。 当这个拆分操作返回一个包含多个元素的数组时,它们应该在管道上拆分(split("\\|")),并且生成的单元格应该被合并。

从这里它只是元素操纵,以获得它的想要的格式。