正则表达式替换时删除不匹配的行

Regex Remove non matching line while substituting

给定 ; 分隔列的文本字符串:

a;b;c
a;x;23
b;b;12

我希望获得第 1 列中具有 a^(a);(.*?);(.*?)$ 的每一行的第 3 列,如图 here

但是,如您所见,替换后的结果中也出现了完整的不匹配行。

知道如何只获取匹配行的第 3 列,而没有不匹配的行。

谢谢

如果第一个替代项不匹配,您可以添加一个 .* 替代项以仅匹配该行:

^(?:(a);(.*?);(.*?)|.*)$
 ^^^               ^^^

regex demo

注意:如果要求只匹配字符串中的两个分号,需要使用[^;]*而不是.*?:

^(?:(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 列,匹配除 ; 或换行符之外的任何字符
  • $ 字符串结束

Regex demo