1

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

my $var = "This apple is white";
$var =~ s/(.*)pple(.*)/No apples for you!/i;

现在我想反转它,所以如果找不到 pple,那么它应该用“No apples for you!”替换所有内容。

我试图用这个反转

my $var = "This apple is white";
$var =~ s/(.*)^pple(.*)/No apples for you!/i;

但我可以找出如何让它工作。

4

1 回答 1

7

“替换所有内容”完全等于“分配新值”。因此,当简单匹配就足够了时,您不需要替换运算符 ('s///'):

my $var = 'This apple is white';
if ($var !~ /\bapple\b/i) {
  $var = 'No apples for you!';
}

我稍微更改了一个正则表达式:添加了/i修饰符,使模式不区分大小写(以捕获“Apple”和“apple”;我想这就是为什么在原始帖子中它是“pple”),并用\b(以防止匹配 'Applegate' 和 'pineapple')。

更新:我认为这是最清晰的解决方案,但从技术上讲,它仍然可以做到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 正则表达式快速入门Perl 正则表达式

于 2013-02-01T10:22:16.650 回答