正则表达式以匹配记事本++ 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
正则表达式详细信息:
^
: 开始
(
: 开始捕获组 #1
(?:[^|\n]*\|){3}
:
)
: 结束捕获组
(?![\r\n])
:否定前瞻断言我们在当前位置 之前没有\r
或\n
很自然的做法是检查 2 个管道和一些数据在正后视中,但 Notepad++ 不进行可变长度后视。相反,我们可以将前导放入捕获组并将该捕获组包含在结果中。
^(((([^|]*?)|("[^"]*?"))\|){2}([^|]*?|"[^"]*?"))\|(?!$)
这允许在管道之间引用。您的替换字符串应该是 $1\n 以恢复第 1 组中捕获的内容。我冒昧地允许使用负前瞻在行尾使用裸管道字符。
试试这个短代码,按预期工作,
查找内容:^(.*?\K\|){3}(?=.)
替换为:|\n
我有一个竖线分隔的 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
正则表达式详细信息:
^
: 开始(
: 开始捕获组 #1(?:[^|\n]*\|){3}
:
)
: 结束捕获组(?![\r\n])
:否定前瞻断言我们在当前位置 之前没有
\r
或\n
很自然的做法是检查 2 个管道和一些数据在正后视中,但 Notepad++ 不进行可变长度后视。相反,我们可以将前导放入捕获组并将该捕获组包含在结果中。
^(((([^|]*?)|("[^"]*?"))\|){2}([^|]*?|"[^"]*?"))\|(?!$)
这允许在管道之间引用。您的替换字符串应该是 $1\n 以恢复第 1 组中捕获的内容。我冒昧地允许使用负前瞻在行尾使用裸管道字符。
试试这个短代码,按预期工作,
查找内容:^(.*?\K\|){3}(?=.)
替换为:|\n