如果我有匹配运算符,如何将括号中捕获的字符串部分保存在变量中,而不是使用$1
,$2
等等?
... = m/stuff (.*) stuff/;
左边是什么?
答案 0 :(得分:33)
诀窍是使用列表赋值使m //在列表上下文中工作:
($interesting) = $string =~ m/(interesting)/g;
这可以整齐地扩展到抓住更多东西,例如:
($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g;
答案 1 :(得分:8)
使用包围构造(...)
创建捕获缓冲区。然后使用特殊变量$1
,$2
等来访问捕获的字符串。
if ( m/(interesting)/ ) {
my $captured = $1;
}
答案 2 :(得分:4)
通常您还需要进行测试以确保输入字符串与正则表达式匹配。这样你也可以处理错误情况。
要提取有趣的东西,你还需要有一些方法来锚定你有兴趣提取的位。
因此,在您的示例中,这将首先确保输入字符串与我们的表达式匹配,然后在两个“无聊”位之间提取位:
$input = "boring interesting boring";
if($input =~ m/boring (.*) boring/) {
print "The interesting bit is $1\n";
}
else {
print "Input not correctly formatted\n";
}
答案 3 :(得分:2)
您可以使用命名捕获缓冲区:
if (/ (?<key> .+? ) \s* : \s* (?<value> .+ ) /x) {
$hash{$+{key}} = $+{value};
}
答案 4 :(得分:2)
@strings
位于左侧并包含结果,然后输入您的输入字符串$input_string
。不要忘记标记g
以匹配所有子字符串。
my @strings=$input_string=~m/stuff (.*) stuff/g;
答案 5 :(得分:0)
$&amp; - 与上一个匹配的字符串 成功的模式匹配(不计算在内 任何隐藏在BLOCK或 由当前BLOCK包围的eval()。
#! /usr/bin/perl
use strict;
use warnings;
my $interesting;
my $string = "boring interesting boring";
$interesting = $& if $string =~ /interesting/;