2013-02-01 72 views
1

我想替换完整的字符串,如果找不到则使用正则表达式。 我使用这个如果发现更换:“没有苹果给你”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; 

反转,但我可以找出如何使它工作。

+2

你可以用'!〜'为这 – gaussblurinc

+0

@loldop这就是答案:p – MattLBeck

+0

@Mattrition是啊,我知道,但它是简短的答案,我没有足够的时间来讲述好的书,我建议初学者和好的网站和其他的东西。我只是发现他〜'' - 另一个Perl的美丽和神秘;) – gaussblurinc

回答

7

“全部替换”与“分配新值”完全相同。所以,你不需要更换运营商(的///“),当简单的比赛应该足够了:

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

我变了一个正则表达式位:加/i修改,使得图案不区分大小写(以捕捉'苹果'和'苹果';我想这就是为什么在原始文章中是'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

+0

嘿,我不想用if。它是否可以在我的正则表达式中使用? – Peter

+0

@PeterI,这里是你如何描述你想要做的事情:“**如果没有找到pple,那么它应该替换为”没有苹果给你!“。 – 2013-02-01 10:28:39

+0

替换运算符用于替换某些如果没有匹配,“替换”就没有意义了,你可以用一个更短的等价表达式替换'if'语句,但是直接在正则表达式中尝试这样做会是愚蠢的。 – 2013-02-01 10:31:15