【问题标题】:Regex to match quotes in CSV inside fields正则表达式匹配字段内 CSV 中的引号
【发布时间】:2021-09-02 12:00:59
【问题描述】:

我正在尝试编写一个正则表达式来匹配 CSV 字段中的双引号(并用转义的双引号替换它们,但替换部分很容易)。

所以我想要

"field1","field2" -> "field1","field2"
"field1","fie"ld2" -> "field1","fie""ld2"

我使用(?<!;)"(?!;) 作为我的匹配表达式,这几乎 工作 - 但它不处理行首或行尾的引号。我需要像 (?<![;$])"(?![;^]) 这样的东西,它不起作用,因为精确的 $^ 字符在这里匹配 - 或者 (?<!(;|$))"(?!(;|^)) 这也不起作用,因为负向后看不能是可变长度。

请问这样做的正确方法是什么?

【问题讨论】:

  • 为什么要捕获环视模式? (?<!;|^)"(?!;|$) 有效。见the regex demo。更好的是,使用 (?<=[^;])"(?=[^;]) 甚至不使用交替。

标签: regex linux pcre


【解决方案1】:

PCRE 正则表达式引擎不允许在后视中捕获带有交替运算符的组。

您可以将您尝试过的正则表达式重新表述为

(?<!;|^)"(?!;|$)
(?<=[^;])"(?=[^;])

请参阅 the regex demothis regex demo

(?&lt;!;|^)"(?!;|$) 模式匹配一​​个" 字符,该字符不在字符串的开头,也没有紧跟在; 字符之前(由于(?&lt;!;|^)),并且没有紧跟; char 而不是在字符串的末尾(请参阅(?!;|$))。

(?&lt;=[^;])"(?=[^;]) 正则表达式匹配",该" 前面紧跟一个; 以外的字符(因此,不允许字符串位置的开始),然后是一个; 以外的字符(不允许字符串结束位置)。

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2020-02-19
    • 2016-04-18
    相关资源
    最近更新 更多