0

私は正規表現の初心者で、他の 2 つの単語の間にあるテキストを切り取りたいと思っています。私はそれを行うためにQTを使用しています。いくつかの例:

<li class="wx-feels">
Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;</i>
</li>

私は手に入れたい Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;

上記のコード、特に数値55 から、私の考えは、最初にテキストから行全体を切り取り、次にそれを検索することでしたが、テキスト全体からそれを回復することはできません。

私はそのようなものを入力しました:

QRegExp rx("(Feels like <i><span class=\"wx-value\" itemprop=\"feels-like-temperature-fahrenheit\">)[0-9]{1,3}(</span>&deg;</i>)");
QStringList list;
list = all.split(rx);

テキスト全体はどこ all にありますが、リストには不要な部分文字列のみが含まれています。QString を 3 つの部分に分割する可能性はありますか? 1 番目 - 冒頭のテキスト (これは望ましくありません) 2 番目 - 必要なテキスト 3 番目 - 残りのテキストは?

4

1 に答える 1

0

説明

この正規表現は、li タグのクラスが である li タグ内の内部文字列を収集しwx-feels、span タグ内の数値もキャプチャします。

<li\b[^>]*\bclass=(["'])wx-feels\1[^>]*?>(.*?\bitemprop=(['"])feels-like-temperature-fahrenheit\3[^>]*>(\d+).*?)<\/li>

ここに画像の説明を入力

グループ

グループ 0 は、LI の開始タグと終了タグを含む文字列全体を取得します。

  1. LI クラス属性のオープン クォートを取得します。これにより、値の後に正しい終了引用符を見つけることができます
  2. LI タグ内の文字列を直接取得する
  3. itemprop 属性のオープン クォートを取得します
  4. スパン内部テキストから数字を取得します

この PHP の例は、正規表現がどのように機能するかを示すためのものです。

<?php
$sourcestring="<li class=\"wx-feels\">
Feels like <i><span class=\"wx-value\" itemprop=\"feels-like-temperature-fahrenheit\">55</span>&deg;</i>
</li>";
preg_match('/<li\b[^>]*\bclass=(["\'])wx-feels\1[^>]*?>(.*?\bitemprop=([\'"])feels-like-temperature-fahrenheit\3[^>]*>(\d+).*?)<\/li>/ims',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
 
$matches Array:
(
    [0] => <li class="wx-feels">
Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;</i>
</li>
    [1] => "
    [2] => 
Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">55</span>&deg;</i>

    [3] => "
    [4] => 55
)

免責事項

エッジケースが多いため、正規表現を使用して html を解析すると問題が発生する可能性があります。入力テキストを制御できる場合、または入力テキストが常にサンプルと同じくらい基本的なものである場合は、問題はないはずです。

QT にある場合は、HTML 解析ツールを使用してこのデータを取得することをお勧めします。

于 2013-06-01T19:31:58.733 に答える