用于匹配未被引号括起的选项卡的正则表达式

时间:2010-12-08 19:54:28

标签: .net regex string

我有以下字符串:

ID Table 1 Table 2
1 "Column 1 Column 2 Column 3
1 2 3
4 5 6
7 8 9" "Column A Column B Column C
a b c
d e f
g h i"

第一行包含列标题(ID,Table1,表2)。 secound排列数据。

通过此Excel表格中的剪贴板复制字符串: http://i.stack.imgur.com/5lwaT.png

列由\ t分隔,\ n由\ r \ n分隔。 B2和C2是表格。她的列和行也被\ t和\ r \ n分隔。 每个表都被行情包围。

现在我分开了行:

Dim rows() as String
Regex = New Regex("\r\n")
rows = Regex.Split(MyString)

返回:

ID Table 1 Table 2

1 "Column 1 Column 2 Column 3
1 2 3
4 5 6
7 8 9" "Column A Column B Column C
a b c
d e f
g h i"

现在我需要分割线条,但是我需要一个模式来返回没有被引号括起来的每个标签。

有人能用正则表达式帮我吗?

谢谢:)

3 个答案:

答案 0 :(得分:0)

我将它用于我的CSV文件,但是,通过一些小的调整,它也可以使用制表符分隔:

Regex rExp = new Regex(@"(?:^|\x09)(\""(?:[^\""]+|\"\")*\""|[^\x09]*)");

供参考,CSV Regex:

Regex rExp = new Regex(@"(?:^|,)(\""(?:[^\""]+|\""\"")*\""|[^,]*)");

请注意,这也不会捕获周围的引号。

修改

也许我假设太多了,但似乎你正在试图获得价值并且正在陷入分界线。这将捕获分隔符中的值。

<强> EDITv2

使用逐字字符串

答案 1 :(得分:0)

因为我太累了,无法想到好的答案,所以这里有一个黑客。如果您可以确定引号已配对,则可以通过三个步骤轻松解决此问题:

  1. 找到引号中的标签并将其换出。
  2. 拆分标签
  3. 重新放入真正的标签。
  4. 像这样:

    // JS psuedo-code
    str = str.replace( /("[^"]*)\t([^"]*")/g, '$1ëïÒ$2' );
    pieces = str.split( /\t/ );
    for (var i=0,len=pieces.length;i<len;++i){
      pieces[i] = pieces[i].replace( /ëïÒ/g, "\t" );
    }
    

    可怕的黑客部分是使用替代字符串,你可以希望它永远不会自然发生。

答案 2 :(得分:0)

您要做的是创建CSV解析器(在您的情况下用tab替换逗号)。有一篇很好的文章说明为什么你不应该这样做:http://secretgeek.net/csv_trouble.asp我曾经尝试编写自己的解析器,但后来停止了因为它真的不那么容易。 Check this free one。它为我节省了几个小时。