什么是正则表达式来返回较长字符串中两个字符之间的子字符串?

时间:2009-07-22 16:36:55

标签: regex perl

我在Perl中有一个字符串,如:“ Full Name (userid) ”,我想只返回用户ID(“()”之间的所有内容)。

在Perl中,正则表达式会执行什么操作?

5 个答案:

答案 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 =〜/\((。*?)\)/;