2009-07-22 81 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; 
相關問題