Regex在替换时删除不匹配的行

Regex在替换时删除不匹配的行,regex,pcre,Regex,Pcre,给定此文本字符串分隔列: a;b;c a;x;23 b;b;12 我希望在第1列中使用^(a)获得每行第3列的a;(.*?);(.*)$如图所示 但是,正如您所看到的,在替换之后,完整的非匹配行也出现在结果中 关于如何只获取匹配行的第三列,而不获取非匹配行的任何想法 谢谢如果第一个备选方案不匹配,您可以添加一个*备选方案来匹配该行: ^(?:(a);(.*?);(.*?)|.*)$ ^^^ ^^^ 见 注意:如果要求字符串中只匹配两个分号,则需要使用[^;]*而

给定此
文本字符串分隔列:

a;b;c
a;x;23
b;b;12
我希望在第1列中使用
^(a)获得每行第3列的
a
;(.*?);(.*)$
如图所示

但是,正如您所看到的,在替换之后,完整的非匹配行也出现在结果中

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


谢谢

如果第一个备选方案不匹配,您可以添加一个
*备选方案来匹配该行:

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

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

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

请参阅(
\n
添加到演示中的否定字符类中,以说明正则表达式测试是在单个多行字符串上执行的,而不是在一组单独的字符串上执行的)。

除了替换之外,您还可以仅在匹配开始时使用。然后匹配第二列,并使用
\K
忘记目前匹配的内容

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

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

非常感谢Wiktor。在上一个演示中,第四行有4列,以
a
开头。在这种情况下,也应返回第三个束。这是如何实现的?@fionpo Add
(?:;*)
,请参阅。我明白了。我将仔细研究这个例子。有很多东西要学。非常感谢威克托
^a;[^;\r\n]+;\K[^;\r\n]+$