2016-09-07 18 views
-4

私の入力があります
<span question_number="18"> blah blah blah 1</span>
<span question_number="19"> blah blah blah 2</span>
通知をカバーできる素朴な解決策:それらが異なるLIN上にあります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>
あるとき私の出力が18ある

blah blah blah 1</span><span question_number="19"> blah blah blah 2

どのように私ができた:ES
出力されますこの問題を回避しますか?

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

testinput:
CASE1 - > 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>
ケース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>

の一行アップデート2:
これはdomではありません。単に私が処理したいプレーンテキストです。

Update3: 正規表現についての私の問題は解決されました。正規表現とドミノ演算の間の処理速度の比較に関する質問がありますか?どのようにそのようなテストを実装することができますか?

+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を読むよう促します。タグが付きません - xhtml-self-contained-tags/1732454#1732454あまりにも遅くなります –

+0

これを編集してもらえますか? – evolutionxbox

答えて

1

それは本当にHTML(うーん?)あなたは

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

See it here at regex101でそれを行うことができない場合。

オリジナルの正規表現の問題は、それがグリーディであることです。部分(.*)は可能な限り多くの文字と一致し、残っている<\/span>がまだ一致していることを確認します。したがって、最初に<span...が見つかり、まで一致します。</span>です。ソリューションでの私の試みは非貪欲であり(? in (.*?))、最初の</span>にマッチするだけです。

+0

ありがとうございます – MohanL

0

私はこの問題を、DOM環境ではなく文字列が含まれているかのように見てきました。終わりには<と突然それをHTMLにします。あなたがその文字列をコントロールしていて、その文字列に含まれるものとその境界を理解している場合、それがあなたのニーズに特有のものであれば、問題に対する多くの解決策があります。

とにかく、あなたが答えを探していて、すべての質問が確かに<span>の属性 "question_number"の中にあると知っていれば、あなたはこのようなことができると思います。正規表現はありません。

これは、HTML文字列から情報を抽出する方法を示す簡単なバージョンです。簡単にするために、私はテキストエリアの中に貼り付けました。このコードをコピーして実行することができます。

しかし、現実には、<span>タグのすべてが含まれていることがわかっているコンテナのinnerHTML値を取得する必要があります。

私は、これを解決するためのさまざまな方法がたくさんあることを知っていますが、これはあなたの特定の必要性に対する答えです。

<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は[タグ:javascript]タグを削除し、あなたがあなたの回答を投稿する約10分前に(おそらくそれを書いている間に)[tag:ruby]タグを追加しました。残念ながら、これはあなたの答えを無効にします。 –

+0

こんにちは、あなたの仕事をありがとう、私はどのようにDOM操作を行う方法を理解しますが、あなたは正規表現とDOM操作を使用する間の速度をテストするために知っていますか? – MohanL

+0

解析している特定のコードでregexと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パーサーによって解析された:あなたは明らかに 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."]] 

それは私には非常に明確ではありません。

関連する問題