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
第3列,匹配除[^;\r\n]+]
以外的任何字符代码>或换行符
字符串结尾$
非常感谢Wiktor。在上一个演示中,第四行有4列,以
a
开头。在这种情况下,也应返回第三个束。这是如何实现的?@fionpo Add(?:;*)
,请参阅。我明白了。我将仔细研究这个例子。有很多东西要学。非常感谢威克托
^a;[^;\r\n]+;\K[^;\r\n]+$