修复用于替换引号内所有 \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]+(?:""|[^";])*"
我将 [;]
更改为 ;
因为它们在您的情况下是等效的。还向 [^";]
添加了 ;
字符,因为您的 CSV 流列值不能包含此字符。
我不知道为什么你在正则表达式中有 ""
但如果你想考虑列值中的其他双引号,我假设它们必须被 \
转义所以你可以使用像 (^|;)"(?:(?<=\)"|[^";])*[\n\r]+(?:(?<=\)"|[^";])*"
这样具有 (?<=\)"
而不是 ""
的正则表达式,后者表示 "
字符前面有反斜杠。 (\"
)
这可能很难解释,我会尽力而为。我目前正在 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]+(?:""|[^";])*"
我将 [;]
更改为 ;
因为它们在您的情况下是等效的。还向 [^";]
添加了 ;
字符,因为您的 CSV 流列值不能包含此字符。
我不知道为什么你在正则表达式中有 ""
但如果你想考虑列值中的其他双引号,我假设它们必须被 \
转义所以你可以使用像 (^|;)"(?:(?<=\)"|[^";])*[\n\r]+(?:(?<=\)"|[^";])*"
这样具有 (?<=\)"
而不是 ""
的正则表达式,后者表示 "
字符前面有反斜杠。 (\"
)