我想替换一个完整的字符串,如果找不到则使用正则表达式。 如果找到,我用它来代替:
my $var = "This apple is white";
$var =~ s/(.*)pple(.*)/No apples for you!/i;
现在我要反转它,所以如果找不到pple,那么它应该替换为“没有苹果给你!”。
我试图用这个反转
my $var = "This apple is white";
$var =~ s/(.*)^pple(.*)/No apples for you!/i;
但我可以找到如何让它发挥作用。
答案 0 :(得分:7)
“替换所有内容”完全等于“分配新值”。所以你不需要替换运算符('s ///'),当简单匹配就足够了:
my $var = 'This apple is white';
if ($var !~ /\bapple\b/i) {
$var = 'No apples for you!';
}
我已经改变了一个正则表达式:添加了/i
修饰符,使得模式不区分大小写(捕获'Apple'和'apple';我想这就是为什么在原帖中它是'pple '),用\b
包裹这个词(以防止'Applegate'和'菠萝'上的匹配)。
更新:我认为这是最清晰的解决方案,但从技术上讲,仍然可以不使用if
:
$var =~ s/^(?!.*\bapple\b.*).*$/No apples for you/i;
这是一个简单的测试:
use 5.010;
use warnings;
use strict;
my @fruit_strings = (
'This apple is white',
'This pineapple is violet',
'This Apple is a company',
'This pear is green');
for (@fruit_strings) {
s/^(?!.*\bapple\b.*).*$/No apples for you/i;
say;
}
请注意,如果您的字符串是多行的,则必须向正则表达式添加/m
修饰符。
另外,我建议您阅读这两个教程 - Perl regular expressions quick start和Perl regular expressions。