0

以下のタグから、正規表現を使用して「id」属性を持たない特定のタグ (tagA|tagB) の詳細のみを選択したいと考えています。

<span class="online"><tagA xmlns="http://www.xyz.com/xml/ja/dtd">A1</tagA><tagB id="tg1" xmlns="http://www.xyz.com/xml/ja/dtd">B1</tagB></span>
<span class="online"><tagA id="tg2" xmlns="http://www.xyz.com/xml/ja/dtd">A2</tagA><tagB xmlns="http://www.xyz.com/xml/ja/dtd">B2</tagB></span>
<tagA id="tg3" xmlns="http://www.xyz.com/xml/ja/dtd">A3</tagA>
<tagB id="tg4" xmlns="http://www.xyz.com/xml/ja/dtd">B3</tagB>
<tagC id="tg5" xmlns="http://www.xyz.com/xml/ja/dtd">C1/tagC>
<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A4</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B4</tagB>
<tagC xmlns="http://www.xyz.com/xml/ja/dtd">C2</tagC>
<tagA>A5</tagA>
<tagB>B5</tagB>
<tagC>C3</tagC>
<span class="online"><i><tagA xmlns="http://www.xyz.com/xml/ja/dtd">A6</tagA></i><b><tagB id="tg6" xmlns="http://www.xyz.com/xml/ja/dtd">B6</tagB></b></span>
<span class="online"><i><tagA id="tg7" xmlns="http://www.xyz.com/xml/ja/dtd">A7</tagA></i><b><tagB xmlns="http://www.xyz.com/xml/ja/dtd">B7</tagB></b></span>

結果として、次の詳細のみを取得する必要があります。

<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A1</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B2</tagB>

<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A4</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B4</tagB>
<tagA>A5</tagA>
<tagB>B5</tagB>

<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A6</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B7</tagB>
4

3 に答える 3

2

この正規表現は、ネストされていても一致します

<(?!.*?\sid=)(.*?)(\s+.*?)?>.*?</\1>

.*?遅延して 0 から多数の文字に一致します

(?!.*?id=)id 属性が存在するかどうかをチェックする否定先読みであり、存在する場合はそれ以上一致しません

で一致するもの()はすべてgroup

\1first一致したグループを参照します。

ここで試すことができます

于 2012-11-23T13:26:38.453 に答える
1

正規表現パターンを使用

<(\S+)(?![^<>]*\bid=).*?<\/\1>
于 2012-11-23T13:51:34.267 に答える
0

これが私がそれを行う方法です:

/<(tag[A-Z]+)(?:\s+(?!id=)\w+="[^"]+")*>\w+<\/\1>/i

それを分解する:

  • <(tag[A-Z]+)開始タグに一致し、その名前をグループ #1 に取り込みます

  • (?:\s+(?!id=)\w+="[^"]+")*属性の名前が異なることを確認した後、属性を 1 つずつ消費しますid

  • >\w+</\1>開始タグを終了し、コンテンツと終了タグを消費します

\w+一部、特にシーケンスを微調整する必要がある場合があります。あなたのデータに慣れていないので、プレースホルダーとして使用するためにそれらを放り込みました。

于 2012-11-26T11:29:34.233 に答える