【问题标题】:Regex replace all newlines between ;" and ";正则表达式替换 ;" 和 "; 之间的所有换行符
【发布时间】:2019-01-22 20:37:48
【问题描述】:

这样的 csv:

A;B;C
1;"a";foo
2;"a
b";{456}
3;"c
d
e";{789}
4;"d

e
f

g";bar

我需要替换 ;" 和 "; 之间的所有换行符 (CRLF)用一些标记,比如<BR>。结果应该是:

A;B;C
1;"a";foo
2;"a<BR>b";{456}
3;"c<BR>d<BR>e";{789}
4;"d<BR><BR>e<BR>f<BR><BR>g";bar

所有其他换行符都应该保持不变。我正在尝试使用 Notepad++ 中的正则表达式替换来做到这一点。到目前为止,我发现我可以替换

(;")(([^"])(\r\n)([^"])+)(";)

\1\3&lt;BR&gt;\5\6

这在第 2 行中可以正常工作,但在第 3 行和第 4 行中删除了太多内容。如果必须,我可以为它编写一个 Python 脚本,但我希望它在 Notepad++ 中更快。有什么建议么?

【问题讨论】:

  • 你确定{789}后面的换行符一定要匹配吗? "; 在它使匹配无效之前不应该吗?尝试(?:\G(?!^(?&lt;![\s\S]))|;")(?:(?!;"|";).)*\K\R 并替换为&lt;BR&gt;
  • @WiktorStribiżew 谢谢!您对 {789} 之后的换行符是正确的,您的搜索似乎也有效。我第一次在正则表达式中看到 \G\K\R。会查查他们。再次感谢!

标签: regex notepad++


【解决方案1】:

你可以使用

查找内容(?:\G(?!^(?&lt;![\s\S]))|;")(?:(?!;"|";).)*\K\R
替换为&lt;BR&gt;

详情

  • (?:\G(?!^(?&lt;![\s\S]))|;") - 匹配成功后的位置(\G(?!^(?&lt;![\s\S])),这里\G 匹配字符串的开头或上一个匹配的结尾,(?!^(?&lt;![\s\S])) 是必须减去文档位置匹配的开头)或(@ 987654329@) 一个;" 子字符串
  • (?:(?!;"|";).)* - 除换行符以外的任何字符,0+ 次出现,尽可能多,不启动 ;""; 字符序列
  • \K - 匹配重置运算符,丢弃目前匹配的文本
  • \R - 换行模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多