0

我的字符串是:(一些文本后跟)用户 'Mr.G@rr!s0n' 是 admin。我正在使用这个正则表达式模式:/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";
}
4

3 回答 3

2

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

于 2012-06-25T17:44:22.537 回答
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(),因为单引号和括号都已经在字符串中。

另一种可能性是您在某种评估中使用您的匹配项,但这很愚蠢。所以我不会在那里做猜测。

于 2012-06-25T18:24:30.377 回答
0

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

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

火柴Mr.G@rr!s0n

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

于 2012-06-25T17:22:45.627 回答