2016-09-07 123 views
-4

我輸入的是:
<span question_number="18"> blah blah blah 1</span><span question_number="19"> blah blah blah 2</span>尋找更好的正則表達式的解決方案

,我想我的正則表達式來此 <span question_number="somenumber">xxxx</span>模式
匹配和所需的輸出1.somenumber 2.xxxx

我寫的一個天真的解決方案,可以覆蓋
<span question_number="18"> blah blah blah 1</span>
<span question_number="19"> blah blah blah 2</span>
通知:他們在不同的林ES
輸出爲:18blah blah blah 119blah blah blah 2

但是當輸入爲<span question_number="18"> blah blah blah 1</span><span question_number="19"> blah blah blah 2</span>
這是在同一行

我的輸出是18blah blah blah 1</span><span question_number="19"> blah blah blah 2

我怎麼會繞過這個問題?

更新: 正則表達式:/\<span question_number=(?:\")*(\d*)(?:\")*>(.*)<\/span>/ig

testinput:
情形1 - >的兩行代碼
<span question_number="54">often graces doorways tied into ropes called</span>
<span question_number="54">often graces doorways tied into ropes called <i>ristras</i>.</span>
情形2 - 的代碼>一行
<span question_number="54">often graces doorways tied into ropes called</span><span question_number="54">often graces doorways tied into ropes called <i>ristras</i>.</span>

UPDATE2:
這不是一個dom,它是隻是我想要處理的純文本。

Update3: 所以我關於正則表達式的問題解決了,現在我有一個關於比較正則表達式或dom操作之間的速度問題?怎麼可能實施這樣的測試?

+9

爲什麼你用正則表達式匹配HTML? http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not – epascarello

+6

我催促你閱讀http://stackoverflow.com/questions/1732348/regex-match-open -tags-except-xhtml-self-contained-tags/1732454#1732454之前爲時已晚 –

+0

請問有人可以編輯這個嗎? – evolutionxbox

回答

1

如果它真的不是HTML(嗯?),你可以用

<span question_number="(\d+)">(.*?)<\/span> 

See it here at regex101做到這一點。

您的原始正則表達式的問題是它的貪婪。部分(.*)將匹配儘可能多的字符,確保剩下的<\/span>仍然可以匹配。所以它找到第一個<span...並匹配到最後</span>。我對解決方案的嘗試是非貪婪的(?(.*?)),因此只匹配到第一個</span>

+0

非常感謝你 – MohanL

0

我已經看過這個問題,就好像有一個字符串涉及 - 而不是一個DOM環境。在一天結束時,它是<和>,突然使它成爲HTML。如果你掌握了這個字符串,並且你明白它將包含什麼以及它的邊界,那麼如果問題是針對你的需求的話,那麼就有許多問題的解決方案。

無論如何,如果你正在尋找一個答案,你知道你所有的問題絕對生活在一個<span>與屬性「question_number」,那麼我想你可以做這樣的事情。沒有正則表達式。

這是一個簡單的版本,演示如何從HTML字符串中提取信息。爲了簡單起見,我將它放在textarea中,以便您可以看到它實際上正在工作。您可以複製此代碼並運行它。

但是,實際上,您可能想要獲取容器的innerHTML值,您知道該容器包含所有<span>標記。

我知道會有很多不同的方法來解決這個問題,正如很多人所建議的,但這是對您的具體需求的回答。

<html><body> 
    <textarea id='htmlstring'> 
     <div>Random HTML Before</div> 
     <span question_number="18">blah blah blah 1</span> 
     <span question_number="19">blah blah blah 1</span> 
     <span question_number="21">blah blah blah 1</span> 
     <span question_number="22">blah blah blah 1</span> 
     <div>Random HTML After</div> 
    </textarea> 
    <script type="text/javascript"> 
     var t = document.getElementById('htmlstring'); 
     var q = t.value.split("<span question_number="); 
     q.shift(); 
     for(var i in q){ 
      var d = q[i].split("</span>")[0]; 
      d = d.replace("\">","|"); 
      d = d.replace("\"",""); 
      d = d.split("|"); 
      alert("num="+d[0]+" val="+d[1]); 
     } 
    </script> 
</body></html> 
+0

注意:在你發佈你的答案(大概是在你寫它的時候)之前,OP刪除了[tag:javascript]標籤並且添加了[tag:ruby]標籤約10分鐘。不幸的是,這使你的答案無效。 –

+0

嗨,謝謝你的工作,所以我知道如何做dom操作,但是你知道要測試使用正則表達式和dom操作之間的速度嗎? – MohanL

+0

我不知道你正在解析的特定代碼的正則表達式和dom操作之間的速度差異。我也不知道你打算進行多少次手術。對不起,我不能有任何進一步的幫助。 @JörgWMittag - 謝謝你的頭!是的,這正是發生了什麼! grrr :) –

3

儘管您不解析整個HTML文檔,但您的輸入顯然包含HTML元素。

在這兩種情況下,Nokogiri是首選的庫:

require 'nokogiri' 

input = '<span question_number="18"> blah blah blah 1</span><span question_number="19"> blah blah blah 2</span>' 

doc = Nokogiri::HTML.fragment(input) 
doc.css('span').map { |s| [s[:question_number], s.text] } 
#=> [["18", " blah blah blah 1"], ["19", " blah blah blah 2"]] 
+0

非常感謝。這太棒了。 – MohanL

1

即使你堅持,這是不是HTML,它肯定外觀和氣味喜歡它,它可以,事實上,很容易被由HTML解析器解析:

require 'nokogiri' 

doc = Nokogiri::HTML.fragment <<~'HTML' 
    <span question_number="54">often graces doorways tied into ropes called</span> 
    <span question_number="54">often graces doorways tied into ropes called <i>ristras</i>.</span> 
HTML 

doc.xpath('span').map {|span| next span[:question_number].to_i, span.text } 
#=> [[54, "often graces doorways tied into ropes called"], [54, "often graces doorways tied into ropes called ristras."]] 

它爲什麼你堅持不使用的東西是顯然 HTML HTML解析器是不是很清楚,我。