gpt4 book ai didi

regex - 在字符串中搜索/替换

转载 作者:行者123 更新时间:2023-12-02 06:52:50 27 4
gpt4 key购买 nike

我有一个 Perl 程序,用户可以在其中输入一些文本、搜索模式和替换字符串。

我正在使用 s/// 运算符通过替换字符串替换搜索模式,但在这种情况下,如果用户输入捕获变量(如 $1) 或替换字符串中的反斜杠转义符(如 \u\L),替换模式应该处理这些元字符,而是将它们视为字符串字符。

我有以下代码:

#!/usr/bin/perl -w

use strict;

chomp(my $text = <STDIN>); #read the text
chomp(my $regex = <STDIN>); #read the search pattern
chomp(my $replace = <STDIN>); #read the replacement pattern

$text=~s/$regex/$replace/g; # do replacement

print $text,"\n";

此代码的示例输入是

fred flintstone and wilma flintstone are good couples
(fred|wilma) flintstone
\u\L$1\E Flintstone

上面代码的输出是

\u\L$1\E Flintstone and \u\L$1\E Flintstone are good couples

我在下面的代码中找到了一种正确的方法:

#!/usr/bin/perl -w

use strict;

chomp(my $text = <STDIN>);
chomp(my $regex = <STDIN>);
chomp(my $replace = <STDIN>);

$replace = '"' . $replace . '"'; # creating the string as '"\u\L$1\E Flintstone"'

$text = ~s/$regex/$replace/gee; # applying double evaluation

print $text,"\n";

现在这段代码给出了正确的输出

Fred Flintstone and Wilma Flintstone are good couples

我想知道是否有更好的方法来解决这个问题?

最佳答案

一个双引号的字符串如果不编译就不能插入

/ee 修饰符带有与 eval 相同的警告:执行用户输入的任何类型的代码总是危险的,即使是一个简单的字符串也可能包含由用户喜欢输入的任何 Perl 代码组成的 block ,例如 "my dangerous string @{ unlink glob '*.*'}"

我建议您使用优秀的String::Interpolate模块,它导出一个将使用 Safesafe_interpolate 函数在“安全”隔间中执行插值的模块

#!/usr/bin/perl

use strict;
use warnings 'all';

use String::Interpolate 'safe_interpolate';

my $text = 'fred flintstone and wilma flintstone are good couples';
my $regex = '(fred|wilma) flintstone';
my $replace = '\u\L$1\E Flintstone';

$text =~ s/$regex/ safe_interpolate($replace) /eg; # do replacement

print $text,"\n";

关于regex - 在字符串中搜索/替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39293497/

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