打印匹配值的perl正则表达式是什么?例如,我想195
从这个字符串打印
"2011-04-11 00:39:28,736::[main]::INFO (Main.java:73) Test.Main::main() Total Successful Transactions = 195".
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?提前致谢
mar*_*usk 35
您可以在正则表达式中使用括号来捕获子字符串.捕获的组存储在$ 1,$ 2等中.例:
while (<>) {
if (/Total Successful Transactions = (\d+)/) {
print "$1\n";
}
}
Run Code Online (Sandbox Code Playgroud)
或者,有点短:
while (<>) {
print "$1\n" if /Total Successful Transactions = (\d+)/;
}
Run Code Online (Sandbox Code Playgroud)
sda*_*aau 13
只想稍微改变以前的答案; 请注意,在这种情况下:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = 3/;'
1
Run Code Online (Sandbox Code Playgroud)
......我们打印出1个 - 就像"是的,我得到了一个匹配".如果我们想要返回匹配的文本部分,正如@markusk指出的那样," 在正则表达式中使用括号来捕获子字符串 ":
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/;'
Xy = 3
Run Code Online (Sandbox Code Playgroud)
但是,请注意,在捕获时,您可能会遇到使用此习惯用法连接字符串的问题:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = 3/ . "\n";'
1 # OK
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/ . "\n";'
1 # NOT OK
Run Code Online (Sandbox Code Playgroud)
......所以在这种情况下保持分离可能更好:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = 3)/ ; print "\n";'
Xy = 3 # OK again
Run Code Online (Sandbox Code Playgroud)
但是,如果我们想要捕获"某些东西",比如一个数字 - 那么,因为我们使用括号,我们会自动返回与这个习语的匹配(而不是整个"搜索"字符串):
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /Xy = (\d)/ ; \
print "\n";'
3
Run Code Online (Sandbox Code Playgroud)
...因此,要完整地捕获搜索到的字符串,我们应该将它再次包装在括号中:
$ perl -e '$str="the variable Xy = 3 in this case"; print $str =~ /(Xy = (\d))/ ; \
print "\n";'
Xy = 33
Run Code Online (Sandbox Code Playgroud)
....但是,我们没有得到我们所期望的,因为现在有两场比赛,$1
并且$2
; 显然,成语" print $str =~ /.../
"输出所有匹配(在这种情况下," $1$2
").
因此,为了在此嵌套匹配情况下仅获取搜索到的字符串,我们现在必须仅显式指定$1
:
$ perl -e '$str="the variable Xy = 3 in this case"; $str =~ /(Xy = (\d))/ ; \
print "$1 \n";'
Xy = 3
Run Code Online (Sandbox Code Playgroud)
EDIT oct 2013:Via 将多个正则表达式匹配中的一个赋值为变量Perl one-liner(dereference array?) - 这也可以用于一个衬里:
$ perl -e '$str="the variable Xy = 3 in this case"; \
print ( ( $str =~ /(Xy = (\d))/ )[1] ); print "\n";'
3
Run Code Online (Sandbox Code Playgroud)
...但是,请注意需要第二个包含的括号,print
以便直接使用正则表达式返回(匿名?)数组.
最后,在多行上下文中,确保首先将整个文件/文本"啜饮"成一个字符串; 然后使用/s
(单行模式=匹配换行符)和/g
(全局/多个匹配) - 最后,确保匹配表达式处于while
循环中,以便迭代所有匹配:
$ echo "some data
IN
123
OUT
some more data
is about to follow:
IN
256
OUT
done with data
out" | perl -e '$str = do { local $/; <> }; while ($str =~ /(IN(.*?)OUT)/sg) { print "$1\n"} '
IN
123
OUT
IN
256
OUT
Run Code Online (Sandbox Code Playgroud)
嗯,希望这有助于某人,
干杯!
怎么样:
print $string =~ /Total Successful Transactions = (\d+)/;
Run Code Online (Sandbox Code Playgroud)
你很少需要$1
和朋友一起使用.
归档时间: |
|
查看次数: |
68117 次 |
最近记录: |