2011-03-30 63 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); 

在這種情況下