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

时间:2020-04-11 09:52:15

标签: regex pcre

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

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

我希望获取第1列中带有a的{​​{1}}的每一行的第3列,如here所示。

但是,正如您所看到的那样,替换后结果中还会出现完整的不匹配行。

关于如何只获取匹配行的第三列,而不获取不匹配列的任何想法。

谢谢

2 个答案:

答案 0 :(得分:1)

如果第一个替代项不匹配,则可以添加ALTER TABLE tablename ADD PRIMARY KEY (column1,column3); 替代项以仅匹配该行:

.*

请参见Alex Cowan's Continuous Delivery Pipeline, 2018

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

.*?

请参见regex demo(在演示中的否定字符类中添加了^(?:(a);([^;]*);([^;]*)|.*)$ ,以说明正则表达式测试是在单个多行字符串而不是一组单独的字符串上执行的事实)。 / p>

答案 1 :(得分:1)

您也可以只用a开始比赛,而不是代替比赛。然后匹配第二列,并使用\K忘记到目前为止已匹配的内容。

然后匹配第三列。然后,可以使用negated character class来匹配第2列和第3列的值。

^a;[^;\r\n]+;\K[^;\r\n]+$
  • ^字符串的开头
  • a;字面上匹配
  • [^;\r\n]+;第2列,匹配;或换行符以外的任何字符
  • \K重置匹配缓冲区
  • [^;\r\n]+]第3列,匹配;或换行符以外的所有字符
  • $字符串结尾

Regex demo