使用正则表达式在 Notepad++ 中查找不包含 9 个竖线的行

使用正则表达式在 Notepad++ 中查找不包含 9 个竖线的行

我有一个 CSV 文件,我需要先清理一下,然后再将其读入表格。它是一个用管道分隔的 10 列结构。难点在于,在某些记录中,第 9 列有回车符。我需要用一串符号(作为占位符)替换这些 CRLF 实例,例如 #$%,但我只需要替换在第 9 列中,对于每条记录

因此在这个例子中:

Susan|Ward    |1     |1          |1     |1     |0     |||3250905     
Allen|Doe|4     |1          |1     |1     |0     ||
some text
text
more text in the same column|3250061     
Mary|James|4     |1          |1     |1     |0     |||3250061     Albert|Nordling|1     |1          |1     |0     |0     |||900434      
Henry|Johnson|1     |1          |1     |0     |0     |||900434      
Tony|Anderson    |1     |1          |1     |1     |0     |||3250905     

Susan、Henry 和 Tony 的记录都有 9 个管道,但 Allen 的记录有 CRLF 实例(在 Notepad++ 中),需要将其替换以将它们全部“拉”到同一行,以使该记录全部在一行上。

此外,Mary 和 Albert 的记录都在同一行。我需要能够找到它们,以便将它们分开。

因此,使用正则表达式来查找不包含 9 个竖线的行即可解决问题。

我可以使用以下正则表达式在多行上找到第 9 列的记录:

^[^|]*$

但我不知道如何找到全部不要有 9 个管道 (10 列)。这行不通:

^[^|{9}]*$

什么会造成这种情况?

一个具体点:如果可能的话,我需要能够让搜索选择没有 9 个竖线的整块行(即每条记录)。因此,在我的示例中,以 Allen 开头的行,在 Notepad++ 中进行搜索将突出显示该行和接下来的 3 行。正则表达式^[^|]*$将选择 Allen 行之后的所有三行,因为它正在寻找完全没有竖线的行。

答案1

你可以使用这个表达式来匹配恰好有 10 列的行:
^([^|\n]*\|){9}[^|\n]*$
你可以测试一下这里

在哪里:

  • ^ ... $匹配行首和行末
  • [^|\n]*匹配列的内容(没有 | 也没有换行符;甚至可以为空)
  • \|匹配管道符(需要转义

匹配少于九列的行:
^([^|\n]*\|){0,8}[^|\n]*$

匹配少于九列的行:
^([^|\n]*\|){10,1000}[^|\n]*$

更新

尝试了一下,似乎可以找到不完全是 10 列 (9 |) 的行:
(^([^|\r\n]*\|){0,8}[^|\r\n]*$)|(^([^|\r\n]*\|){10,1000}[^|\r\n]*$)
测试一下这里

相关内容