正则表达式以匹配记事本++ csv 中不完全具有三个管道的行

Regex to match lines that do NOT have exactly three pipes in a Notepad++ csv

我有一个竖线分隔的 csv。每行 应该 只有三个管道来分隔列。我需要找到任何没有三个管道的线路 - 或多或少应该匹配。

我正在学习正则表达式并想到了这个(有点乱七八糟地找到我认为可行的部分...)

^(?:[^|\r\n]*\|){3,}.*$

但是,它只是匹配所有行,而不考虑行中的管道数。

我想做的事情的正确语法是什么?

[更新]

正如@anubhava 指出的,我应该提供一个例子。

这是我文件中的示例数据:

John Doe|1hgds234|Some comment|
Mary Jane|5df678|This column is the end of this record|Harry Jones|3456|Harry's record should be on the next line|
Sue Anderson|037dsf533|Another comment|

Harry Jones 的记录应该换行,从“Harry”开始。每行以竖线和 CRLF 结尾。

所以我需要一个 find/replace 和一个匹配第二行的正则表达式,并在第二行的第三个管道之后放置一个 CRLF。

假设您没有在引用的单元格值内转义 ||,您可以使用此正则表达式进行匹配:

^((?:[^|\n]*\|){3})(?![\r\n])

并将其替换为:

$1\n

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • (: 开始捕获组 #1
    • (?:[^|\n]*\|){3}:
  • ): 结束捕获组
  • (?![\r\n]):否定前瞻断言我们在当前位置
  • 之前没有\r\n

很自然的做法是检查 2 个管道和一些数据在正后视中,但 Notepad++ 不进行可变长度后视。相反,我们可以将前导放入捕获组并将该捕获组包含在结果中。

^(((([^|]*?)|("[^"]*?"))\|){2}([^|]*?|"[^"]*?"))\|(?!$)

这允许在管道之间引用。您的替换字符串应该是 $1\n 以恢复第 1 组中捕获的内容。我冒昧地允许使用负前瞻在行尾使用裸管道字符。

试试这个短代码,按预期工作,
查找内容:^(.*?\K\|){3}(?=.)
替换为:|\n