0

私は多かれ少なかれこの形式のリッチテキストのQStringを持っています:

<span background-color="red"><a name='item1'></a> property1 </span> + <span background-color="blue"><a name='item2'></a> property2 </span>

より多くのタグを持つことができますが、すべて同じ構造になります。また、各タグの間に演算子が表示されます。これは、計算を表す文字列です。

item1文字列をトラバースして、、、item2...;の両方を抽出するには、正規表現が必要です。property1, ,... 部分文字列もあるproperty2ので、別の場所に保存した値を取得できます。

次に、これらを取得した後values、たとえば property1=value1 と property2=value2 の場合、次のような別の文字列を作成する必要があります。

value1+value2

この文字列は、計算を計算するために評価されます。

文字列を読み取るための正規表現は何でしょうか?

コピーされた文字列で置き換える正規表現は何ですか?

注: これらの正規表現を使用してHTMLを解析するつもりはありません。フィルタリングする必要があるリッチ テキストの文字列には上に示したタグと構造しかありません。他のタイプのタグはなく、上記の例の文字列以外の属性もありません。同じタグ構造の例をさらに多く持つことができます: name属性を持つアンカータグと表示するテキストを含むスパン。

注2 @Passerbyは、この質問のコメントに非常に近い解決策へのリンクを投稿しました。私は自分の目的に関する 1 つの (できれば小さな) 詳細を忘れていました。@Passerby が提案spanしたようなものを単にチェックするのではなく、タグの間にあるものを文字列としてキャッチする必要もあります。char何か案は?

注3実際、これは重複マークされた質問と同じ質問ではないと私はまだ主張しています。フィルタリングしている文字列は HTML のように見えますが、実際にはリッチ テキストです。それらは常にこの厳格な構造/形式を持っているため、RegEx は私が行う必要があることに対して完全に実行可能です。@Passerbyという数人のユーザーからいくつかの素晴らしいコメントを受け取った後、私はそれに行くことにしました。これは私が必要としているものに完全に機能します:

サンプル文字列:

<span background-color="red"><a name='item1'></a> property1 </span> + 300 * <span background-color="blue"><a name='item2'></a> property2 </span> + Math.sqrt(<span background-color="green"><a name='item3'></a> property3 </span>)

正規表現:

/ <span.*?><a name='(.*?)'><\/a>\s*(.*?)\s*<\/span>(((.*?)?)(?=<)|) / g

出力:

MATCH 1 
1. [38-43] `item1` 
2. [50-59] `property1` 
3. [67-76] ` + 300 * ` 
4. [67-76] ` + 300 * ` 
5. [67-76] ` + 300 * ` 
MATCH 2 
1. [115-120] `item2` 
2. [127-136] `property2` 
3. [144-157] ` + Math.sqrt(` 
4. [144-157] ` + Math.sqrt(` 
5. [144-157] ` + Math.sqrt(` 
MATCH 3 
1. [197-202] `item3` 
2. [209-218] `property3` 
3. [226-226] (null, matches any position) 
4

2 に答える 2

1

これはおそらく次のようになります。

QRegExp rx("^(?:\\<span background-color=\"red\"\\>\\<a name=')(\\w)(?:'\\>\\</a\\>)\s*(\\d+)\s*(?:\\</span\\>)\s*(\+)\s*(?:\\<span background-color=\"blue\"\\>\\<a name=')(\\w)(?'\\>\\</a\\>)\")\\s*(\\d+)\\s*\\</span\\>)$");

rx.IndexIn(myText);
qDebug() << rx.cap(1) << rx.cap(2) << rx.cap(3) << rx.cap(4) << rx.cap(5);
//will return item1 prop1 + item2 prop2

givenitemは 1 つの単語でありproperty、数字になります。ソフトウェアの電卓で非常に似たようなことをしました。

トリックは、小さなビットから始めることです:

rx("\\<a name='\\w'\\>");

これはアイテムをキャプチャしますが、最終的には完全な行をキャプチャします. 次に、次のビットに進み、ライン全体が希望どおりになるまで続けます。正規表現は非常に強力ですが、非常にイライラすることもあります。

幸運を

編集: すべてのブラケット () は、置換関数で \​​1 を介してアクセスできます。(?:) 括弧はキャプチャされません! そう :

QString text = "My Text";
text.replace("^My( Text)$","His\\1");
//will have returned: His Text
于 2013-07-10T11:35:11.517 に答える
0

正規表現もわかりません。この種の解析の問題では、次のような迅速で(おそらく)汚いソリューションを使用します。

QString str = "<span background-color='red'><a name='item1'></a> property1 </span> + <span background-color='blue'><a name='item2'></a> property2 </span>";
QStringList slist = str.split("<");

qDebug() << slist;

foreach (QString s, slist)
{
    if (s.startsWith("/a"))
    {
        qDebug() << "property:" << s.split(" ")[1];
    }
    else if (s.startsWith("a name"))
    {
        qDebug() << "item:" << s.split("'")[1];
    }
    else if (s.startsWith("/span>"))
    {
        QString op = s.mid(6).trimmed();
        if (op != "")
            qDebug() << "operator:" << op;
    }
}

出力は次のとおりです。

item: "item1" 
property: "property1" 
operator: "+" 
item: "item2" 
property: "property2"

もちろん、これはフォーマットが変わると壊れます。しかし、正規表現も同様です。

形式がさらに複雑になる場合は、形式を有効な XML に変更してから、Qt の XML クラスを使用してデータを解析します。

この種のソリューションを使用することになった場合は、追加の有効性チェックを追加することを強くお勧めします.

于 2013-07-10T10:42:18.910 に答える