2
<tr><td align=right>Name:</td><td align=left><b><font color=black>Nathan</font></b></td></tr>
<tr><td align=right>Extension:</td><td align=left><b>222</b></td></tr>

上記のHTMLグロブのテキスト(変更できません)があり、3つのキャプチャグループ、ラベル(Name|Extension)、フォントの色(black|red)、およびデータを返す正規表現が必要(\w+)です。

フォントの色であるキャプチャグループ2を返すのに問題があります。ご覧のとおり、テーブルの「Extension」行には表示されていないため、キャプチャグループをオプションにしました。私がそうするとき、それは最初の行でまったく一致していません。数量詞のさまざまな組み合わせの試行錯誤を何度も試しましたが、それでも探している結果を得ることができません。

これが私がこれまでに持っているパターンです:(Name|Extension):.*?(?:<font color=(black|red)>)?.*?>(\w+)

.*?オプションのキャプチャグループを消費し、1番目と3番目のグループにのみ一致すると思います。誰かが私がどこで間違っているのか説明してくれるなら、それは素晴らしいことです。

編集:正規表現についてもっと学ぼうとしている人として、私が上に持っているデータをHTMLではなく不変のテキストとして解釈していただければ幸いです。

4

2 に答える 2

3

あなたが探している残虐行為は次のとおりです。

 (Name|Extension).*?<b>[<font color=]{0,12}(black|red)?>?(.*?)</.*

それは地獄のように壊れやすく、あなたが扱っているHTMLのフォーマットがあなたが提供した例と少しでも異なっていれば、私はそれが機能することを絶対に期待していません。ただし、そのHTMLが確実にひどい場合は、大丈夫だと思います。

これは、正規表現を使用してHTMLを解析することの本質的な不可能性に関してSignorMendozaが間違っているという証拠と見なされるべきではないことに注意してください。まったく逆に、それは彼があらゆる点で絶対的に正しいという証拠です。これは解析ではありません。これは不正行為です。私が言ったように、使用しているソースHTMLが、提供したサンプルと同じくらい醜い場合にのみ、問題を回避できます。

テストケース:

 <tr><td align=right>Name:</td><td align=left><b><font color=black>Nathan</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>222</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=red>Thomas</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>223</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=black>Frank</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>224</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=red>Steve</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>225</b></td></tr>
 <tr><td align=right>Name:</td><td align=left><b><font color=black>Tony</font></b></td></tr>
 <tr><td align=right>Extension:</td><td align=left><b>226</b></td></tr>

結果:

 Name black Nathan
 Extension  222
 Name red Thomas
 Extension  223
 Name black Frank
 Extension  224
 Name red Steve
 Extension  225
 Name black Tony
 Extension  226
于 2012-10-02T03:06:44.163 に答える
3

問題は、消極的な数量詞です。最初の.*?ものは最初は何も消費しないため、正規表現の次の部分は、の直後にFONTタグを一致させようとし:ます。見つかりませんが、その部分はオプションなので問題ありません。次に、2番目.*?が引き継ぎ、>(\w+)缶が一致するまで必要なだけ消費します。したがって、FONTタグがある場合、意図したオプションのグループではなく、2番目のタグと一致します.*?

しかし、数量詞を貪欲にすることを気にしないでください。動作する可能性はありますが、失敗する可能性は低くなります。代わりにこれを試してください:

<td[^>]*>(Name|Extension):</td><td[^>]*><b>(?:<font color=(black|red)>)?([^<]*)<

ラベルに続くすべてのタグを明示的に一致させたため、FONTタグがある場合はそれと一致する正しい位置にあります。そこにある場合group(2)は、色が含まれます。それ以外の場合はになりますnull

于 2012-10-02T03:14:40.243 に答える