【发布时间】:2020-04-11 09:52:15
【问题描述】:
给定这个;分隔列的文本字符串:
a;b;c
a;x;23
b;b;12
我希望在第一列中包含a 的每一行的第三列带有^(a);(.*?);(.*?)$,如here 所示。
但是,正如您所见,替换后的结果中也存在完整的不匹配行。
关于如何只获取匹配行的第 3 列而不匹配不匹配行的任何想法。
谢谢
【问题讨论】:
给定这个;分隔列的文本字符串:
a;b;c
a;x;23
b;b;12
我希望在第一列中包含a 的每一行的第三列带有^(a);(.*?);(.*?)$,如here 所示。
但是,正如您所见,替换后的结果中也存在完整的不匹配行。
关于如何只获取匹配行的第 3 列而不匹配不匹配行的任何想法。
谢谢
【问题讨论】:
如果第一个替代项不匹配,您可以添加一个 .* 替代项来匹配该行:
^(?:(a);(.*?);(.*?)|.*)$
^^^ ^^^
注意:如果要求只匹配字符串中的两个分号,则需要使用[^;]* 而不是.*?:
^(?:(a);([^;]*);([^;]*)|.*)$
请参阅this regex demo(\n 添加到演示中的否定字符类以说明正则表达式测试是在单个多行字符串上执行的,而不是一组单独的字符串)。
【讨论】:
a 开头。在这种情况下,也应该返回第 3 列。这是如何实现的?
(?:;.*)?,见demo。
除了替换之外,您还可以只用 a 开始匹配。然后匹配第二列并使用\K 忘记到目前为止匹配的内容。
然后匹配第三列。然后可以使用negated character class 匹配第 2 列和第 3 列的值。
^a;[^;\r\n]+;\K[^;\r\n]+$
^ 字符串开始a; 字面匹配[^;\r\n]+; 第 2 列,匹配除 ; 或换行符以外的任何字符\K重置匹配缓冲区[^;\r\n]+] 第 3 列,匹配除 ; 或换行符以外的任何字符$字符串结束【讨论】: