修复用于替换引号内所有 \n 和 \r 的正则表达式

Fix regex expression used to replace all \n and \r inside quotes

这可能很难解释,我会尽力而为。我目前正在 nodejs 中使用 csv 转换流解析器,但我正在努力替换所有 \n's 和 \r's 内引号 (") 来包装一个值。

目前我有以下正则表达式:

(^|[;])"(?:""|[^"])*[\n\r]+(?:""|[^"])*"

哪里;是列分隔符。

这里有两个例子,第一个是按预期进行的,第二个是捕获但不应该捕获的,因为 ;在引号内。

第一次测试(成功)

test;"123";"this description with new line feed  below should be
matched by regex";test;"1.0"
 

第二次测试(错误)

NewLine1;"test - this one should not be captured by the regex but its being captured ";test;1
NewLine2;"test that went wrong"

有没有办法选择引号之间的文本,在第一个引号之前包含分号,在最后一个引号之后包含分号,但忽略引号内的分号?我想这就是我需要的,所以第二个例子没有考虑正则表达式匹配。

提前致谢。

您可以使用:

(^|;)"(?:""|[^";])*[\n\r]+(?:""|[^";])*"

Regex Demo

我将 [;] 更改为 ; 因为它们在您的情况下是等效的。还向 [^";] 添加了 ; 字符,因为您的 CSV 流列值不能包含此字符。

我不知道为什么你在正则表达式中有 "" 但如果你想考虑列值中的其他双引号,我假设它们必须被 \ 转义所以你可以使用像 (^|;)"(?:(?<=\)"|[^";])*[\n\r]+(?:(?<=\)"|[^";])*" 这样具有 (?<=\)" 而不是 "" 的正则表达式,后者表示 " 字符前面有反斜杠。 (\")