需要正则表达式匹配'Mr.G@rr!s0n'

时间:2012-06-25 17:06:41

标签: regex perl

我的字符串是:(后面跟着一些文字)用户'Mr.G@rr!s0n'是管理员。 我正在使用这个正则表达式模式:/user\s'(.*)'\sis/i 但是,我的输出为 Mr.G!s0n

我的正则表达式模式到底需要改变什么?


以下是代码段:

$text1 = "user 'Mr.G@rr!s0n' is the admin";

if($text1 =~ /user\s'(.*)'\sis/i)
{
    print "\n"; 
    print "Password: ".$1;
    print "\n";
}

3 个答案:

答案 0 :(得分:2)

您使用的是Perl吗?如果是这样,子字符串的@rr部分可以插入到空字符串中(假设您没有名为“rr”的数组)。你需要以某种方式逃脱吗?

答案 1 :(得分:2)

我猜你的代码(由于某些原因你不会显示)是这样的:

my $str = "(some text followed by) User 'Mr.G@rr!s0n' is the admin";
if ($str =~ /user\s'(.*)'\sis/i) {
    print "$1\n";
}

这里的问题是@rr是插值的,因为你使用的是双引号字符串。因为你显然没有使用:

use strict;
use warnings;

..这个错误是沉默的。如果你曾经使用它们,你会得到:

Possible unintended interpolation of @rr in string at
Global symbol "@rr" requires explicit package name at

要解决此问题,请使用''q()单引号字符串:

my $str = q#(some text followed by) User 'Mr.G@rr!s0n' is the admin#;

正如您所注意到的,我使用#作为q()的分隔符,因为单引号和括号都已经在字符串中。

另一种可能性是你在某种评价中使用了你的比赛,但这很愚蠢。所以我不打算在那里猜测。

答案 2 :(得分:0)

如果你的正则表达式引擎支持积极的外观,你可以尝试这样的事情:

正则表达式(?<=User ').*(?=')

匹配Mr.G@rr!s0n

字符串User 'Mr.G@rr!s0n' is the admin

中的