我在Perl中有一个字符串,如:“ Full Name (userid)
”,我想只返回用户ID(“()
”之间的所有内容)。
在Perl中,正则表达式会执行什么操作?
答案 0 :(得分:7)
这将匹配“(
”和“)
”中的任何字词\w
)字符
\w
匹配单词字符(字母数字或_),不仅仅是[0-9a-zA-Z_]
,还包括非罗马字母中的数字和字符。
my($username) = $str =~ /\((\w+)\)/;
# or
$str =~ /\((\w+)\)/;
my $username = $1;
如果您需要s///
,则可以使用$1
或\1
获取变量。
$str =~ s/\((\w+)\)/$1:\1/; # pointless example
如果你想捕捉所有可能性,那么这些可能会更好:
my($username) = $str =~ /\(([^\)]+)\)/;
# or
my($username) = $str =~ /\((.+?)\)/;
如果您的正则表达式开始变得复杂,我建议您了解/x
选项。
my($username) = $str =~ / \( ( [^\)]+ ) \) /x;
<小时/> 有关详细信息,请参阅
perldoc perlre
。
如果您刚开始学习正则表达式,我建议您阅读perldoc perlretut
。
答案 1 :(得分:4)
转义括号,捕捉中间的字符串。假设用户ID仅包含\w
个字符:
my ($userid) = $str =~ /\((\w+)\)/ ;
列表上下文中的 m//
返回捕获的匹配。
有关捕获的更多信息,请参阅
C:\>
perldoc perlretut
答案 2 :(得分:3)
当您在括号内搜索某些内容时,例如“&LT; &GT; [](){}'或更复杂的例如xml / html标签,以这种方式构建模式总是更好:
opening bracket, something which is NOT closing bracket, closing bracket
当然,在你的情况下,'结束括号'可以省略:
my $str = 'Full Name (userid)';
my ($user_id) = $str =~ /\(([^\)]+)/;
答案 3 :(得分:2)
除了已经说过的内容:如果你碰巧知道你的字符串具有这种格式,你也可以不用正则表达式。如果您的字符串位于$s
,则可以执行
chop $s; # throws away last character (by assumption must be closing parenthesis)
$username=substr($s, rindex($s,'(') + 1);
对于正则表达式解决方案,您能否确定全名不能包含一对括号?在这种情况下,在模式结尾处锚定结束')'可能是有意义的:
/ [(] # open paren
([^(]+) # at least one non-open paren
[)] # closing paren
$ # end of line/pattern
/x && $username = $1;
答案 4 :(得分:1)
这将在括号之间得到任何内容,而不仅仅是字母数字和_。这可能不是问题,但\ w不会得到带有破折号,井号等的用户名。
$ str =〜/\((。*?)\)/;