正则表达式匹配每一行

时间:2014-10-31 13:31:51

标签: regex

我需要清理一大堆字符串

    35653_3100552_26952012_cmp.xml.gz
    35653_3100552_26952012_cmp_delta.xml.gz
    35653_3100552_26952012_cmp_deltatemplate.txt.gz
    35653_3100552_26952012_cmp_template.txt.gz
    35653_3100552_26952030_cmp.xml.gz
    35653_3100552_26952030_cmp_delta.xml.gz
    35653_3100552_26952030_cmp_deltatemplate.txt.gz
    35653_3100552_26952030_cmp_template.txt.gz
    35653_3100552_26952044_cmp.xml.gz
    35653_3100552_26952044_cmp_delta.xml.gz
    35653_3100552_26952044_cmp_deltatemplate.txt.gz
    35653_3100552_26952044_cmp_template.txt.gz
    35653_3100552_26952063_cmp.xml.gz
    35653_3100552_26952063_cmp_delta.xml.gz
    35653_3100552_26952063_cmp_deltatemplate.txt.gz
    35653_3100552_26952063_cmp_template.txt.gz
    35653_3100552_26952075_cmp.xml.gz
    35653_3100552_26952075_cmp_delta.xml.gz
    35653_3100552_26952075_cmp_deltatemplate.txt.gz
    35653_3100552_26952075_cmp_template.txt.gz
    35653_3100552_26952086_cmp.xml.gz
    35653_3100552_26952086_cmp_delta.xml.gz
    35653_3100552_26952086_cmp_deltatemplate.txt.gz
    35653_3100552_26952086_cmp_template.txt.gz
    35653_3100552_26952105_cmp.xml.gz
    35653_3100552_26952105_cmp_delta.xml.gz
    35653_3100552_26952105_cmp_deltatemplate.txt.gz
    35653_3100552_26952105_cmp_template.txt.gz

我只想保留以cmp.xml.gz结尾的那些 我要删除的所有其他内容以及删除空白空间。

我试过这个35653(.*)cmp_delta.xml.gz,但这只是选择从第二行到最后一行的所有内容。

所以我的问题是,我可以使用哪个正则表达式删除不以cmp_delta.xml.gz结尾的每一行?

顺便说一句,我将在Coda中使用这个正则表达式。

由于

更新

在下面的答案中尝试了Kendall和Key提供的正则表达式,这是Coda的结果

    35653_3100552_26952012_cmp.xml.gz.lmp
    .lmp
    35653_3100552_26952012_cmp_deltatemplate.txt.gz.lmp
    35653_3100552_26952012_cmp_template.txt.gz.lmp
    35653_3100552_26952030_cmp.xml.gz.lmp
    .lmp
    35653_3100552_26952030_cmp_deltatemplate.txt.gz.lmp
    35653_3100552_26952030_cmp_template.txt.gz.lmp
    35653_3100552_26952044_cmp.xml.gz.lmp
    .lmp
    35653_3100552_26952044_cmp_deltatemplate.txt.gz.lmp
    35653_3100552_26952044_cmp_template.txt.gz.lmp
    35653_3100552_26952063_cmp.xml.gz.lmp
    .lmp
    35653_3100552_26952063_cmp_deltatemplate.txt.gz.lmp
    35653_3100552_26952063_cmp_template.txt.gz.lmp
    35653_3100552_26952075_cmp.xml.gz.lmp
    .lmp
    35653_3100552_26952075_cmp_deltatemplate.txt.gz.lmp
    35653_3100552_26952075_cmp_template.txt.gz.lmp
    35653_3100552_26952086_cmp.xml.gz.lmp
    .lmp
    35653_3100552_26952086_cmp_deltatemplate.txt.gz.lmp
    35653_3100552_26952086_cmp_template.txt.gz.lmp
    35653_3100552_26952105_cmp.xml.gz.lmp
    .lmp
    35653_3100552_26952105_cmp_deltatemplate.txt.gz.lmp
    35653_3100552_26952105_cmp_template.txt.gz.lmp

3 个答案:

答案 0 :(得分:2)

正则表达式在默认模式下不会匹配多行,因为.与换行符不匹配。它匹配的唯一方法是正则表达式处于“单行”模式,这意味着. 匹配换行符。

如果Coda允许,请关闭单线模式(这与打开多线模式不同;正则表达式既可以使用两种模式,也可以两种都不使用。)

如果Coda没有提供更改单行标记的选项,您可以使用.模仿[^\r\n]

35653[^\r\n]*cmp_delta\.xml\.gz

更新

如果你可以在Coda中使用多线模式,请打开它,然后在正则表达式的末尾添加$

如果没有,如果您将(?=[\r\n])添加到最后,您可能会找到成功。我不知道Coda支持什么,所以我不能肯定地说会有什么用。

尽管如果每一行以.lmp结尾,只需将\.lmp添加到正则表达式的末尾就更有意义了。

更新

似乎Coda中的最佳解决方案是用空字符串替换所有不以cmp_delta.xml.gz.lmp结尾的行。

35653[^\r\n]*(?=[\r\n])(?<!cmp_delta\.xml\.gz\.lmp)

答案 1 :(得分:1)

尝试

35653(.*?)cmp_delta.xml.gz

而不是你的

35653(.*)cmp_delta.xml.gz

额外的&#39;?&#39;制作&#39; *&#39;行为不贪婪,说它会匹配可能的最小字符数。

换句话说,当您使用35653(.*)cmp_delta.xml.gz时,您正在匹配&#34; 35653&#34;在第一次出现和最后出现的&#34; cmp_delta.xml.gz&#34;整个序列。

35653(.*?)cmp_delta.xml.gz将匹配&#34; 35653&#34;在第一次出现时,直到第一次出现&#34; cmp_delta.xml.gz&#34;。

答案 2 :(得分:0)

进行查找和替换。找到^.*(?<!cmp\.xml\.gz)$\n?并替换为空。