2011-03-30 68 views
0

为什么此代码打印51而不是26?我试图提取“价值”。 即我想要(粗体一个):<选项值=“安达曼&尼科巴” >安达曼&尼科巴< /选项>Perl m操作员问题

作为每个定义米与列表上下文g操作者应在括号返回模式?

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; 
+2

轻微的观察,这并不样子有效的HTML,你应该逃避和到& – IanNorton 2011-03-30 18:37:14

+0

假如您打印'@ cities'而不是'scalar @ cities',你会早一点得到你的答案。如果*摘要*信息抛出您,则不要仅打印摘要信息。 – Axeman 2011-03-30 23:15:50

回答

6

每个/ g的比赛开始,在此之前的一个不放过,但由于使用的是零宽度断言,你实际上并没有消耗。”所以

">Andaman & Nicobar</option> 
     <option value=" 

被认为是匹配。太

务必:

my @cities = $firstpage =~ m/"([^"]*)"/gs; 

,而不是需要注意的是,如果有捕获括号,只有吨。这些内容是由列表上下文中的成功返回的。

1

正则表达式正在抓住你认为是所引用的城市,以及一个城市的末尾引用和下一个城市的开始引用之间的文本。我假设如果你没有在最后的双引号中做出零宽度断言,你的问题就会消失。

2

一个更好的将是:

my @cities=($firstpage=~/value="([^"]+)"/gs); 

在这种情况下