我在Perl中有一个字符串,如:“Full Name (userid)
”,我想只返回userid(“()
”之间的所有内容)。什么是正则表达式来返回长字符串中两个字符之间的子字符串?
什么正则表达式会在Perl中做到这一点?
我在Perl中有一个字符串,如:“Full Name (userid)
”,我想只返回userid(“()
”之间的所有内容)。什么是正则表达式来返回长字符串中两个字符之间的子字符串?
什么正则表达式会在Perl中做到这一点?
这将匹配任何字(\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
。
转义括号,捕获中间的字符串。假设用户id包括仅\w
字符:
my ($userid) = $str =~ /\((\w+)\)/ ;
m//
上下文返回所捕获的匹配。在拍摄
更多信息可以在
那么只需将额外的括号返回值呢? (\ w +)vs \ w +? – Brian 2009-07-22 16:54:39
这将让括号,而不仅仅是字母数字和之间的任何_被发现。这可能不是问题,但是\ w不会得到破折号,英镑符号等用户名。
$ str =〜/\((.*?)\)/;
当您搜索括号内的内容时,例如“<> [](){}”或更为复杂的诸如XML/HTML标记,它总是更好地构建的图案的方式:
opening bracket, something which is NOT closing bracket, closing bracket
当然,你的情况的闭括号'可以是省略:
my $str = 'Full Name (userid)';
my ($user_id) = $str =~ /\(([^\)]+)/;
除了说了些什么:如果你碰巧知道你的字符串恰好有这种格式,你也可以不用正则表达式。如果字符串是$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;
当然,如果他想要什么*括号之间,这将是/(\(\ w + \)) /? – IRBMe 2009-07-22 16:40:27
假设他不需要`()`我的回答是正确的。 – 2009-07-22 16:52:02