匹配某些文本,但在输出中省略它

时间:2018-04-16 23:41:28

标签: regex notepad++

在Notepad ++中查找和替换正则表达式功能,是否有任何方法可以匹配某些文本,但不包含在替换中?例如:([ab][cd] )*用于匹配ac ad bc bc ad等字符串,并将其替换为$0,但不包括[ab]部分,或者在上述字符串的情况下, c d c c d。虽然只有Notepad ++的正则表达方言的答案才有用,但如果有人知道其他方言的解决方案,我会好奇地看到它们,并且它们可能适用于这种方言。

修改

模式很容易匹配,我不知道怎么做的部分是让替换做我想做的事。对于我给出的示例表达式,模式(?:[ab]([cd]))*实际上是有效的,在替换框中有$1,但是说,它对我的​​实际用例不起作用,因为[ab][cd]是结果的子表达式(注意我不认为它会产生影响,否则我会在原始问题中发布这个,我的道歉);一个更好的例子是我想要f(ac ad bc bc ad):替换为f(ac ad bc bc ad): f'(c d c c d)的字符串(所以,我真的想要定期添加)。我尝试使用正则表达式([a-z])\((?:[ab]([cd] ?))*\):,替换为$0$1'($2),但这会导致$2的值为最后匹配的值(即f(ac ad bc bc ad): f'(d))。

1 个答案:

答案 0 :(得分:0)

Notepad ++查找和替换功能并未提供解决此特定问题的功能。正如我所看到的,你需要匹配一个子字符串并替换它的一部分而不影响文本中的类似模式,我认为这些模式应该是通用的,以便能够扩展。

  

如果有人知道其他方言的解决方案......

awk救援

您必须使用编程语言或更强大的文本处理工具。如果您的环境中有awk实施,您可以在一秒钟内实现您的目标:

awk '{
    sepRe = "[ab]"
    regex = "(" sepRe "[cd] )+"
    while(match($0, regex)) {
        str = substr($0, RSTART, RLENGTH);
        current = str
        gsub(sepRe, "", current)
        sub(str, current, $0)
    }
    print;
}' file

$ cat file

ac ad bc bc ad
ac same ab ad af

运行awk输出:

c d c c ad
c same ab d af

请注意,上次ad

后没有空格