为什么此代码打印51而不是26?我正试图提取“价值观”。 这就是我想要的(粗体):< option value =“ Andaman& Nicobar ”> Andaman&尼科巴< /选项>
根据定义m在列表上下文中使用g运算符应该在parantheses中返回模式吗?
my $firstpage=<<'EOF';
<option value="Andaman & Nicobar">Andaman & Nicobar</option>
<option value="Andhra Pradesh">Andhra Pradesh</option>
<option value="Assam">Assam</option>
<option value="Bihar">Bihar</option>
<option value="Calcutta Telecom District">Calcutta Telecom District</option>
<option value="Chennai Telecom District">Chennai Telecom District</option>
<option value="Chhattisgarh">Chhattisgarh</option>
<option value="Gujarat">Gujarat</option>
<option value="Haryana">Haryana</option>
<option value="Himachal Pradesh">Himachal Pradesh</option>
<option value="Jammu & Kashmir">Jammu & Kashmir</option>
<option value="Jharkhand">Jharkhand</option>
<option value="Karnataka">Karnataka</option>
<option value="Kerala">Kerala</option>
<option value="Madhya Pradesh">Madhya Pradesh</option>
<option value="Maharashtra">Maharashtra</option>
<option value="North East I">North East I</option>
<option value="North East II">North East II</option>
<option value="Orissa">Orissa</option>
<option value="Punjab">Punjab</option>
<option value="Rajasthan">Rajasthan</option>
<option value="Tamilnadu">Tamilnadu</option>
<option value="UP East">UP East</option>
<option value="UP West">UP West</option>
<option value="Uttaranchal">Uttaranchal</option>
<option value="West Bengal">West Bengal</option>
EOF
my @cities=$firstpage=~m{(?<=")([^"]*)(?=")}gs;
print scalar @cities;
答案 0 :(得分:6)
每个/ g匹配从上一个停止的地方开始,但由于你使用零宽度断言,你实际上并没有消耗“。所以
">Andaman & Nicobar</option>
<option value="
也被视为匹配。
执行:
my @cities = $firstpage =~ m/"([^"]*)"/gs;
代替。请注意,如果有捕获括号,则只有m // g在列表上下文中成功返回这些内容。
答案 1 :(得分:2)
更好的是:
my @cities=($firstpage=~/value="([^"]+)"/gs);
在这种情况下
答案 2 :(得分:1)
正则表达式正在抓住您认为引用的城市,以及一个城市的最终引用与下一个城市的起始引用之间的文本。我假设如果你没有在末尾双引号上进行零宽度断言,你的问题就会消失。