匹配嵌套在另一个引号字符串中的引号字符串的正则表达式

7
我有一个数据源,它是逗号分隔的,并加上引号限定符。一个CSV文件。然而,数据源提供者有时会做一些奇怪的事情。我已经解决了其中除一个之外的所有问题(我们逐行读取文件,然后在清理后将其写回),现在我正在寻找解决最后一个问题的方法,但我的正则表达式技巧相当弱。
匹配一个引号包含在另一个引号中的字符串的例子如下:...
"foobar", 356, "Lieu-dit "chez Métral", Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18"

我希望匹配子字符串"chez Métral",以便用子字符串"chez Métral"替换它。理想情况下,只需尽可能少的代码行数实现。最终目标是将该行写回(或将其作为方法返回值返回),并已经完成替换。
因此,我们的示例字符串最终变为...
"foobar", 356, "Lieu-dit chez Métral, Chilly, FR", "-1,000.09", 467, "barfoo", 1,345,456,235,231, "935.18"

我知道我可以定义一个模式,例如(?<quotedstring>\"\w+[^,]+\")来匹配带引号的字符串,但是我的正则表达式技能不强(数据库开发人员,几乎从不使用C#),因此我不确定如何在命名组quotedstring中匹配另一个带引号的字符串。


对于那些注意到用逗号格式化但没有引号限定的大整数的人来说,已经处理了。与随机使用行分隔符(有时是CR,有时是LF)一样。还有其他问题...


1
看起来你尝试创建的CSV文件格式非常糟糕(不是有效的CSV格式)。使用正则表达式可能不是一个好的解决方案。 - Oded
1
A->"A"|a 是一个上下文无关文法,不能用正则表达式正确匹配。 - fardjad
你是如何“已经处理”嵌入逗号和“其他问题”的?这种方法是否可以用来处理额外的引号? - Dour High Arch
@Oded 我同意!不幸的是,我无法说服数据提供者。 :) 这不是一个常见的情况,但这个数据源偶尔会出现这种情况。在7000个源文件中,我们有38个出现在14个文件中。我们没有任何实例,其中存在任意深度的嵌套 - 它总是一级深度。现在,有问题的行只是通过异常处理程序被丢弃以便稍后处理。 - The Lazy DBA
", "(逗号空格)是分隔符吗?还是可能在引用字符串中包含“,”? - Austin Salonen
1个回答

4

使用这个正则表达式进行替换

(?<!,\s*|^)"([^",]*)"

现在用$1替换它

在这里尝试这个


""转义"后,它会变成

(?<!,\s*|^)""([^"",]*)""

似乎在上述模式中,“356”和“1,345,456,235,231”也是匹配项,除了“chez Métral”之外。 - The Lazy DBA
@TheLazyDBA,看起来不是这样的,因为我已经测试过了...它可以工作。 - Anirudha
您能否进一步详细解释您的答案? - The Lazy DBA
它确实能够工作,不幸的是我的示例字符串是不正确的,所以你的解决方案不适用! / 脸掌 - The Lazy DBA
我有。例子字符串是准确的。 - The Lazy DBA
1
谢谢!在过去的一周里,我不得不学习一些Python,编写一个报告网站爬虫,重新熟悉C#(我主要是T-SQL和PL/SQL),第一次处理XSLT...但正则表达式?在如此短的时间内掌握更高级的结构有限制。感激不尽! - The Lazy DBA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接