Perl - Regex取代负面

时间:2013-02-01 10:18:34

标签: regex perl

我想替换一个完整的字符串,如果找不到则使用正则表达式。 如果找到,我用它来代替:

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;

但我可以找到如何让它发挥作用。

1 个答案:

答案 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 startPerl regular expressions