gpt4 book ai didi

regex - 在perl中自动生成替换

转载 作者:行者123 更新时间:2023-12-02 09:05:18 25 4
gpt4 key购买 nike

我正在尝试基于一些输入在perl中自动生成正则表达式模式,以处理由 token 粘贴到Makefile中创建的各种变量...因此,例如,我可能具有以下模式:

foo_1_$(AB)_$(CB)

在这种模式下,我需要创建一个正则表达式,将所有 foo_1_\$(\w+)_\$(\w+)实例转换为 bar_1_\$($1)_\$($2)。我遇到的主要问题是模式的“to”侧-每次我都需要增加 $数字引用-请注意,在任何给定的模式中, token 的数量都是可变的。

所以...我在想这样的事情:
foreach $pattern (@patterns) {
my $from = $pattern;
# foo_1_$(AB)_$(CD)
$from =~ s/\$\(\w+\)/\$\(\\w\\\+\)/g;
# foo_1_$(\w+)_$(\w+)

my $to = $pattern =~ s/foo/bar/r;
# bar_1_$(AB)_$(CD);
$to =~ s/\$\(\w+\)/\\\$\(\$?)/g; #???
# bar_1_\$($1)_\$($2)
# ^ ^

#this next part is done outside of this loop, but for the example code:
$line ~= s/\Q$from\E/$to/;
}

如何使 to中的每个后续替换都具有增量索引?

最佳答案

编写代码以根据给定的模式生成正则表达式是一项复杂的工作(在最简单的情况下除外),那就是在精确指定该模式可以是什么时。在这种情况下,我也看不到为什么不能通过为给定类型的模式编写正则表达式来解决问题(而不是编写将编写正则表达式的代码)。†

无论哪种情况,都需要那些正则表达式,所以这里有一些。由于没有给出关于可能的模式的精确规则,因此我使用了一些从问题提示中得出的基本假设。

我认为要替换的模式(foo_)后跟有一个数字,然后是模式_$(AB)(字面美元和内含字符的parens),重复了任意次(“可能有可变数量的 token ”) 。

解决此问题的一种方法是匹配整个以下模式(所有重复)。提前

s/[a-z]+_([0-9]+)(?=_(\$\(\w+\))+)/XXX_$1/;

一站式简单测试
perl -wE'$_=q{foo_1_$(AB)_$(CB)}; s/[a-z]+_([0-9]+)(?=_(\$\(\w+\))+)/XXX_$1/; say'

foo替换为 XXX。它仅适用于一组 _$(AB),也适用于两个以上的组。

如果不根据问题的“精神”来决定是否遵循 foo_1,则这与单独的 _$(AB)不匹配(因为未明确说明此类要求)。如果实际上也应该匹配这种情况,则可以进行一些小的更改(主要与将 _移至要替换的模式有关,这是可选的( [a-z]+_[0-9]+_?)))

更新。如果 foo_后面的“ token ”(将被替换)实际上可以是任何东西(因此不一定是 $(..)),除了它们与 _串在一起外,我们可以使用类似
/[a-z]+_(\d?)(?=(_[^_]+)*)/XXX_$1/;

其中 foo_后的数字是可选的,每个示例在注释中给出。但这更简单
/[a-z]+(?=(_[^_]+)*)/XXX/;


perl -wE'
$_=q{foo_$(AB)_123_$(CD)_foo_$(EF)}; say;
s/[a-z]+(?=(_[^_]+)*)/XXX/; say'

版画

foo _ $(AB)_123 _ $(CD)_foo _ $(EF)
XXX _ $(AB)_123 _ $(CD)_foo _ $(EF)

注意:上面的正则表达式也由 /[a-z]+(?=_)/XXX/完成。但是,可以对上面更详细的正则表达式进行调整并使其适应更精确的要求,我将使用它或它的变体作为完整解决方案的主要构建块。

如果关于某种模式的规则的结构性较差(少于“与 _连接的任何 token ”),那么我们需要非常准确地了解它们。

显然,这不是根据给定的模式生成正则表达式,而是要求匹配这种(类)模式的正则表达式。如果有足够的规范来说明这些模式是什么样的,那么这可以解决问题-这对于生成正则表达式也是必要的。

†另一个选择是使用某些模板系统,然后您再次直接编写正则表达式以匹配给定类型的模式。

关于regex - 在perl中自动生成替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com