Notepad++ 中的 RegEx 查找管道少于或多于 n 的行
RegEx in Notepad++ to find lines with less or more than n pipes
我有一个大的竖线分隔的文本文件,每行应该有一个 3 列记录。许多记录在一列中被换行符分割。
我需要做一个 find/replace 来为每个 line/record 获得三个,而且只有三个管道。
这是一个示例(我添加了换行符 (\r\n
) 以演示它们的位置以及需要替换的内容):
12-1234|The quick brown fox jumped over the lazy dog.|Every line should look similar to this one|\r\n
56-7890A|This record is split\r\n
\r\n
on to multiple lines|More text|\r\n
09-1234AS|\r\n
||\r\n
\r\n
56-1234|Some text|Some more text\r\n
|\r\n
76-5432ABC|A record will always start with two digits, a dash and four digits|There may or may not be up to three letters after the four digits|\r\n
需要注意的是,我需要为目标系统保留那些中间记录换行符。它们需要替换为 \.br\
。所以上面的最终结果应该是这样的:
12-1234|The quick brown fox jumped over the lazy dog.|Every line should look similar to this one|\r\n
56-7890A|This record is split\.br\.br\on multiple lines|More text|\r\n
09-1234AS|\.br\||\.br\r\n
56-1234|Some text|Some more text\.br\|\r\n
76-5432ABC|A record will always start with two digits, a dash and four digits|There may or may not be up to three letters after the four digits|\r\n
如您所见,记录中间的换行符已全部替换为 \.br\
,并且保留了行尾的换行符以将每个 three-column/pipe 记录保留在自己的行中.注意最后一条记录的文本,解释每个 line/record 是如何开始的。我将其包括在内,以防有助于构建正则表达式以正确识别记录的开头。
我不确定这是否可以在一个 find/replace 步骤中完成,或者是否需要(或应该)分成几个步骤。
我想先搜索 |\r\n
,因为所有记录都以竖线和 CRLF
结尾,然后用虚拟文本 !@#$
替换它们。然后用 \r\n
搜索剩余的换行符,这将是中间列换行符并将它们替换为 \.br\
,然后用我想要保留的原始换行符替换虚拟文本 |\r\n
.
除了看起来像第一个示例中的第三条记录的记录外,这对所有记录都有效,该示例在记录中的竖线之后有几个换行符。在我处理的如此大的文件中,直到很久以后我才发现我使用的上述过程没有正确捕获这些实例。
你可以使用
(?:\G(?!^(?<!.))|^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?)\K\R+
替换为\.br\
。参见regex demo。 详情:
(?:\G(?!^(?<!.))|^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?)
- 上一场比赛结束 (\G(?!^(?<!.))
) 或 (|
) 一行开始,两位数,0
,一个或多个数字,零个或多个字母,|
,然后是 |
以外的任何零个或多个字符,尽可能少,然后是可选的 |
序列和任何零个或多个字符除了 |
,尽可能少(参见 ^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?
)
\K
- 省略匹配的文本
\R+
- 一个或多个换行符。
查看 Notepad++ 演示:
如果您需要在此之后删除空行,请使用 Edit
> Line Operations
> Remove Empty Lines
.
我有一个大的竖线分隔的文本文件,每行应该有一个 3 列记录。许多记录在一列中被换行符分割。
我需要做一个 find/replace 来为每个 line/record 获得三个,而且只有三个管道。
这是一个示例(我添加了换行符 (\r\n
) 以演示它们的位置以及需要替换的内容):
12-1234|The quick brown fox jumped over the lazy dog.|Every line should look similar to this one|\r\n
56-7890A|This record is split\r\n
\r\n
on to multiple lines|More text|\r\n
09-1234AS|\r\n
||\r\n
\r\n
56-1234|Some text|Some more text\r\n
|\r\n
76-5432ABC|A record will always start with two digits, a dash and four digits|There may or may not be up to three letters after the four digits|\r\n
需要注意的是,我需要为目标系统保留那些中间记录换行符。它们需要替换为 \.br\
。所以上面的最终结果应该是这样的:
12-1234|The quick brown fox jumped over the lazy dog.|Every line should look similar to this one|\r\n
56-7890A|This record is split\.br\.br\on multiple lines|More text|\r\n
09-1234AS|\.br\||\.br\r\n
56-1234|Some text|Some more text\.br\|\r\n
76-5432ABC|A record will always start with two digits, a dash and four digits|There may or may not be up to three letters after the four digits|\r\n
如您所见,记录中间的换行符已全部替换为 \.br\
,并且保留了行尾的换行符以将每个 three-column/pipe 记录保留在自己的行中.注意最后一条记录的文本,解释每个 line/record 是如何开始的。我将其包括在内,以防有助于构建正则表达式以正确识别记录的开头。
我不确定这是否可以在一个 find/replace 步骤中完成,或者是否需要(或应该)分成几个步骤。
我想先搜索 |\r\n
,因为所有记录都以竖线和 CRLF
结尾,然后用虚拟文本 !@#$
替换它们。然后用 \r\n
搜索剩余的换行符,这将是中间列换行符并将它们替换为 \.br\
,然后用我想要保留的原始换行符替换虚拟文本 |\r\n
.
除了看起来像第一个示例中的第三条记录的记录外,这对所有记录都有效,该示例在记录中的竖线之后有几个换行符。在我处理的如此大的文件中,直到很久以后我才发现我使用的上述过程没有正确捕获这些实例。
你可以使用
(?:\G(?!^(?<!.))|^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?)\K\R+
替换为\.br\
。参见regex demo。 详情:
(?:\G(?!^(?<!.))|^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?)
- 上一场比赛结束 (\G(?!^(?<!.))
) 或 (|
) 一行开始,两位数,0
,一个或多个数字,零个或多个字母,|
,然后是|
以外的任何零个或多个字符,尽可能少,然后是可选的|
序列和任何零个或多个字符除了|
,尽可能少(参见^\d{2}-\d+[A-Z]*\|[^|]*?(?:\|[^|]*?)?
)\K
- 省略匹配的文本\R+
- 一个或多个换行符。
查看 Notepad++ 演示:
如果您需要在此之后删除空行,请使用 Edit
> Line Operations
> Remove Empty Lines
.