【问题标题】:Regex Remove non matching line while substituting正则表达式在替换时删除不匹配的行
【发布时间】:2020-04-11 09:52:15
【问题描述】:

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

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

我希望在第一列中包含a 的每一行的第三列带有^(a);(.*?);(.*?)$,如here 所示。

但是,正如您所见,替换后的结果中也存在完整的不匹配行。

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

谢谢

【问题讨论】:

    标签: regex pcre


    【解决方案1】:

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

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

    regex demo

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

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

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

    【讨论】:

    • 非常感谢维克托。在上一个演示中,第四行有 4 列以 a 开头。在这种情况下,也应该返回第 3 列。这是如何实现的?
    • @fionpo 添加(?:;.*)?,见demo
    • 我明白了。我将仔细研究这个例子。很多东西要学。非常感谢维克托
    【解决方案2】:

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

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

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

    Regex demo

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 2011-09-03
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多