【问题标题】:Regex search to find and remove consecutive lines which end with same characters正则表达式搜索以查找并删除以相同字符结尾的连续行
【发布时间】:2023-02-02 04:44:04
【问题描述】:

我需要编写一个正则表达式搜索,当一行以与前一行相同的文本结尾,但前 10 个字符不同时,它会定位。所以在这个例子中:

[11:12:21] Hello this is Tom. How are you?
[11:14:08] Hello this is Tom. How are you?

. . .在括号中输入时间后,我需要搜索文本相同的连续行。

我知道这个搜索:

FIND: ^.{11}(.*)$
REPLACE; $1

. . .将找到前 11 个字符并将其删除。

这个搜索:

FIND: ^((.{10}).*)(?:\r?\n\2.*)+
REPLACE: $1

. . .将找到前 10 个字符相同的行并将其删除。

但我不知道如何构造搜索,所以它检查从位置 11 到行尾的文本,然后检查下一行从第 11 个字符到行尾的文本是否相同.

【问题讨论】:

    标签: regex


    【解决方案1】:

    如果你想从字符串的开头匹配方括号并且它之后的部分在下一行应该是相同的,你可以使用 2 个捕获组来在替换时也保留第一部分:

    ^([[^][]*])(.*)(?:
    ?
    [[^][]*])+
    

    模式匹配:

    • ^ 字符串开始
    • ([[^][]*])捕捉第 1 组, 匹配来自[...]
    • (.*)捕捉第 2 组, 匹配该行的其余部分
    • (?:非捕获组
      • ? 匹配换行
      • [[^][]*]匹配来自[...]
      • 与之前在组 2 中捕获的相同
    • )+关闭非捕获组,匹配1行或多行

    用。。。来代替:

    $1$2
    

    regex demo

    如果它也不应该在下一行的方括号之间具有相同的字符,则可以在换行符 (?!) 之后使用否定前瞻来断言与第一个捕获组中的值不同:

    ^([[^][]*])(.*)(?:
    ?
    (?!)[[^][]*])+
    

    见另一个regex demo


    如果它应该是 10 个字符:

    ^(.{10})(.*)(?:
    ?
    .{10})+
    

    regex demo

    而不是使用否定前瞻在下一行的开头使用相同的 10 个字符:

     ^(.{10})(.*)(?:
    ?
    (?!).{10})+
    

    见另一个regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2017-01-18
      • 2011-11-21
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多