我正在使用maven replacer plugin我遇到的情况是我有一个正则表达式,它匹配我需要在输入文件上运行的行,直到所有匹配被取代了。此表达式的配置如下所示:
<regexFlags>
<regexFlag>DOTALL</regexFlag>
</regexFlags>
<replacements>
<replacement>
<token>\@([^\n\r=\@]+)\@=([^\n\r]*)(.*)(\@default\.\1\@=[^\n\r]*)(.*)</token>
<value>@$1@=$2$3$5</value>
<replacement>
<replacements>
输入可能如下所示:
@d.e.f@=y @a.b.c@=x @h.i.j@=aaaa @default.a.b.c@=QQQ @asdfasd.fasdfs.asdfa@=23423 @default.h.i.j@=234 @default.RR.TT@=393993
我希望输出看起来像这样:
@d.e.f@=y @a.b.c@=x @h.i.j@=aaaa @asdfasd.fasdfs.asdfa@=23423 @default.RR.TT@=393993
目的是重写文件,但没有带有@default
前缀的令牌,其中已经定义了没有前缀的另一个令牌。
@default.a.b.c@=QQQ
和@default.h.i.j@=234
已从输出中删除,因为其他令牌已包含a.b.c
和h.i.j
。
我当前的问题是,replacer插件只替换了第一个匹配,因此我的输出如下所示:
@d.e.f@=y @a.b.c@=x @h.i.j@=aaaa @asdfasd.fasdfs.asdfa@=23423 @default.h.i.j@=234 @default.RR.TT@=393993
此处@default.a.b.c=QQQ
已消失,这是正确的,但@default.h.i.j@=234
仍然存在。
如果我在代码中写这个,我想我可能只是在尝试匹配整个输出时循环,并在没有匹配时中断。有没有办法用replacer插件做到这一点?
编辑:我可能过度简化了我的例子。更现实的是:
@d.e.f@=y @a.b.c@=x @h.i.j@=aaaa @default.a.b.c@=QQQ @asdfasd.fasdfs.asdfa@=23423 @default.h.i.j@=234 @default.RR.TT@=393993 @x.y.z@=0 @default.q.r.s@=1 @l.m.n@=8.3 @q.r.s@=78 @blah.blah.blah@=blah
这表明default.x.x.x=y
可以 x.x.x=y
令牌(@default.q.r.s@=1
先于@ qrs @ = 78`),我之前的例子对此并不清楚。我确实有一个表达式来捕获它,它看起来有点像这样:
\@default\.([^\n\r=@|]+)@=([^\n\r|]*)(.*)@\1@=([^\n\r|]*)(.*)
我知道线条分隔符在这个中缺失,即使它们在另一个 - 我正在试验删除所有行分隔符并将其作为单行处理,但这没有帮助。我可以通过多次复制和粘贴配置来多次运行每次替换来解决这个问题,但这不是一个好的解决方案,最终会失败。
答案 0 :(得分:1)
我不相信你可以解决这个问题,解决办法是从上到下颠倒文件的顺序,执行前瞻性正则表达式然后反转结果顺序
pattern = @default\.(.*?)@[^\r\n]+(?=[\s\S]*@\1@)
Demo
另一种方式(取决于“Maven”的功能)是运行此模式
@(.*)(@[\s\S]*)@default\.\1.*
并在循环中替换为@$1$2
Demo,直到没有匹配
然后运行此模式
@default\.(.*)@.*(?=[\s\S]*\1)
并在循环中替换为Demo,直到没有匹配
答案 1 :(得分:0)
看起来替换器插件实际上并不能实现我想要的效果。我通过使用正则表达式构建多个过滤器文件,然后将它们应用于资源文件来解决这个问题。
我最初的目标是使用正则表达式构建一个干净整洁的过滤器文件。最后,我发现只使用多个过滤器(不是干净或整洁)就可以逃脱,并以正确的顺序应用它们。