2009-07-22 62 views

回答

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

+0

当然,如果他想要什么*括号之间,这将是/(\(\ w + \)) /? – IRBMe 2009-07-22 16:40:27

+2

假设他不需要`()`我的回答是正确的。 – 2009-07-22 16:52:02

4

转义括号,捕获中间的字符串。假设用户id包括仅\w字符:

在列表
my ($userid) = $str =~ /\((\w+)\)/ ; 

m//上下文返回所捕获的匹配。在拍摄

更多信息可以在

C:\>perldoc perlretut

+0

那么只需将额外的括号返回值呢? (\ w +)vs \ w +? – Brian 2009-07-22 16:54:39

1

这将让括号,而不仅仅是字母数字和之间的任何_被发现。这可能不是问题,但是\ w不会得到破折号,英镑符号等用户名。

$ str =〜/\((.*?)\)/;

3

当您搜索括号内的内容时,例如“<> [](){}”或更为复杂的诸如XML/HTML标记,它总是更好地构建的图案的方式:

opening bracket, something which is NOT closing bracket, closing bracket 

当然,你的情况的闭括号'可以是省略:

my $str = 'Full Name (userid)'; 
my ($user_id) = $str =~ /\(([^\)]+)/; 
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; 
相关问题