0

したがって、私はまだ REGEX のダミーであり、過去 2 日間しか使用していません。しかし、少なくとも私にとっては、私の問題は奇妙に思えます。

次のパターンは、この文字列に正しく一致します。

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+<td>(([a-z]|[A-Z]|=|\\s)+)<br>

元の文字列 (入力として正規表現に供給されている html ドキュメントから取得):

<td valign=3D"top">For:</td>     =             <td>XXXXXX XXXXX<br>

および一致した文字列:

<td valign=3D"top">For:</td>     =             <td>XXXXXX XXXXX<br>

ただし、この文字列の場合:

<td valign=3D"top">For:</td>                     <td>YYYYYYY=     YYYYY<br>

HTMLドキュメント全体と一致しました。タグ(([a-z]|[A-Z]|=|\\s)+が必要だと指定した後、なぜこれが起こっているのかわかりません<br>

4

2 に答える 2

2

貪欲ではないマッチングのために、示された疑問符を追加します。

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|\r\n|\n)+?<td>(([a-z]|[A-Z]|=|\\s)+?)<br>
                                                    ^                         ^

編集:

さらに、代替を使用する代わりに文字クラスに単純化できます。

<td valign=3D\"top\">For:</td>(\\s)+(=)?(.|[\r\n])+?<td>([a-zA-Z=\\s]+?)<br>
                                           ^^^^^^        ^^^^^^^^^^^^

私の唯一の質問は、あなたがそうでないのに、なぜあなた\\sが逃げているのかという\r\nことです...

編集2:

たとえば、スペースは必須ではありません*+貪欲ではない量指定子は、おそらくこれらの場合に常に役立ちます。

<td valign=3D\"top\">For:</td>(\\s)*?(=)?(.|[\r\n])*?<td>([a-zA-Z=\\s]*?)<br>
                                   ^^       ------ ^-     ------------^-
于 2012-07-11T13:44:04.257 に答える
1

正規表現を使用して HTML を解析することは、非常に悪い考えです。

理由はこちら: RegEx は、XHTML 自己完結型タグを除く開始タグに一致します。

HTML で非常に単純なものを解析する場合でも、DOM パーサーを使用すると、一般的にクリーン (読みやすく) になり、エラーが発生しにくくなります。REGEX を初めて使用する場合はなおさらです

于 2012-07-11T13:43:47.023 に答える