正则表达式替换时删除不匹配的行
Regex Remove non matching line while substituting
给定 ;
分隔列的文本字符串:
a;b;c
a;x;23
b;b;12
我希望获得第 1 列中具有 a
且 ^(a);(.*?);(.*?)$
的每一行的第 3 列,如图 here。
但是,如您所见,替换后的结果中也出现了完整的不匹配行。
知道如何只获取匹配行的第 3 列,而没有不匹配的行。
谢谢
如果第一个替代项不匹配,您可以添加一个 .*
替代项以仅匹配该行:
^(?:(a);(.*?);(.*?)|.*)$
^^^ ^^^
注意:如果要求只匹配字符串中的两个分号,需要使用[^;]*
而不是.*?
:
^(?:(a);([^;]*);([^;]*)|.*)$
参见 this regex demo(\n
添加到演示中的否定字符 class 以解释正则表达式测试是在单个多行字符串上执行的事实,而不是集合单独的字符串)。
除了替换之外,您还可以仅以 a 开始匹配。然后匹配第二列,用\K
忘记到目前为止匹配的是什么。
然后匹配第三列。然后可以使用 negated character class.
匹配第 2 列和第 3 列的值
^a;[^;\r\n]+;\K[^;\r\n]+$
^
字符串开头
a;
字面匹配
[^;\r\n]+;
第 2 列,匹配除 ;
或换行符之外的任何字符
\K
重置匹配缓冲区
[^;\r\n]+]
第 3 列,匹配除 ;
或换行符之外的任何字符
$
字符串结束
给定 ;
分隔列的文本字符串:
a;b;c
a;x;23
b;b;12
我希望获得第 1 列中具有 a
且 ^(a);(.*?);(.*?)$
的每一行的第 3 列,如图 here。
但是,如您所见,替换后的结果中也出现了完整的不匹配行。
知道如何只获取匹配行的第 3 列,而没有不匹配的行。
谢谢
如果第一个替代项不匹配,您可以添加一个 .*
替代项以仅匹配该行:
^(?:(a);(.*?);(.*?)|.*)$
^^^ ^^^
注意:如果要求只匹配字符串中的两个分号,需要使用[^;]*
而不是.*?
:
^(?:(a);([^;]*);([^;]*)|.*)$
参见 this regex demo(\n
添加到演示中的否定字符 class 以解释正则表达式测试是在单个多行字符串上执行的事实,而不是集合单独的字符串)。
除了替换之外,您还可以仅以 a 开始匹配。然后匹配第二列,用\K
忘记到目前为止匹配的是什么。
然后匹配第三列。然后可以使用 negated character class.
匹配第 2 列和第 3 列的值^a;[^;\r\n]+;\K[^;\r\n]+$
^
字符串开头a;
字面匹配[^;\r\n]+;
第 2 列,匹配除;
或换行符之外的任何字符\K
重置匹配缓冲区[^;\r\n]+]
第 3 列,匹配除;
或换行符之外的任何字符$
字符串结束