【问题标题】:.NET Regex To Remove Line Breaks Within Quotes.NET 正则表达式删除引号内的换行符
【发布时间】:2014-04-21 18:06:25
【问题描述】:

我正在尝试清理一个文本文件,以便将其导入 Excel,但该文本文件在几个双引号字段中包含换行符。该文件是制表符分隔的。

例如:

"12313"\t"1234"\t"123

5679"
"test"\t"test"\t"test"
"test"\t"test"\t"test"
"12313"\t"1234"\t"123

5679"

我需要删除换行符,以便最终显示如下:

"12313"\t"1234"\t"1235679"
"test"\t"test"\t"test"
"test"\t"test"\t"test"
"12313"\t"1234"\t"1235679"

“\t”是制表符分隔符。

我查看了其他几个关于 SO 的解决方案,但它们似乎无法处理多行。我们已经尝试使用几种 CSV 解析器解决方案,但似乎无法让它们在这种情况下工作。目标是将整个字符串传递到 REGEX 表达式中,并使其返回,同时删除引号之间的所有换行符,而保留引号外的换行符。

【问题讨论】:

  • 请向我们展示您尝试过但失败的正则表达式。
  • Here's someone who had a similar problem 事实证明,引号内的换行符与实际行之间的换行符不同。如果您可以使用能够显示换行符的文本编辑器中的示例以某种方式找到它,则可以使用非常简单的正则表达式。如果它们是相同的换行符,那么您将不得不以更复杂的方式进行操作,例如 anubhava 的正则表达式。
  • @Jerry - 你知道任何文本编辑器会显示文本文件中的实际换行符吗?这将有助于确定换行符是否只是 \n 或其他东西。感谢您的评论。
  • @ChasonArthur 我知道 Notepad++ 可以,显然有一个 SublimeText3 的包可以显示它们,显然 Ctrl+.Eclipse 中显示它们。虽然我不知道很多编辑器,但是常规的记事本、写字板等不支持它。 AFAIK。

标签: c# regex


【解决方案1】:

你可以使用这个正则表达式:

(?!(([^"]*"){2})*[^"]*$)\n+

Working Demo

这一项匹配一个或多个不跟随偶数引号的换行符(假设数据中没有转义异常)。

【讨论】:

    【解决方案2】:

    这对我有用:

    var fixedCsvFileContent = Regex.Replace(csvFileContent, @"(?!(([^""]*""){2})*[^""]*$)\n+", string.Empty);
    

    没有工作:

    var fixedCsvFileContent = Regex.Replace(csvFileContent, @"(?!(([^""]*""){2})*[^""]*$)\n+", string.Empty, RegexOptions.Multiline);
    

    因此在对输入字符串进行检查时不能添加RegexOptions.Multiline。

    【讨论】:

      【解决方案3】:

      如果只是删除空行有效:

      string text = Regex.Replace( inputString, @"\n\n", "" , RegexOptions.None | RegexOptions.Multiline );
      

      【讨论】:

        【解决方案4】:
        string output = Regex.Replace(input, @"(?<=[^""])\r\n", string.Empty);
        

        Demo with the input provided

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-07
          • 2013-01-13
          • 2011-07-01
          • 2018-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多