1

現在、正規表現を学んでいて、わからないことがたくさんあります。

アイテムを抽出したいテーブルのあるウェブサイトがあります。列の 1 つは固定値 (この例では "foo") を含むか何も含まないかのいずれかで、他の列には常に何らかのデータが含まれます。それらの抽出はうまく機能しますが、特別な列のオプションのコンテンツは機能しません。したがって、私は次のような表現を使用します

<a id=x .*?>(.*?)</a>.*?<a id=y .*?>(.*?)</a>

私の実際の問題は、最終式の次の部分です

...   .*?(foo)?.*?   ...

これは、他のセルの間にコンテンツ foo を持つセルがあることを達成する必要があります。これは見逃す可能性があり、そこにある場合にのみ返されます。私は何を間違っていますか?基本的な理解?

4

1 に答える 1

0

regex.*?(foo)?.*?では、fooはオプションであるため、正規表現エンジンはテキスト内の現在の位置だけを調べます。存在する場合fooは、一致に含まれます。それ以外の場合は、何もないことを確認せずにスキップしfooます。

正規表現を に変更することで、動作を少し変更できます(.*?foo|.*?).*?。正規表現は、次の を見つけるために最善を尽くしますfoo。前の文字列に が含まれていない限り、foo上記の正規表現は確実に を消費しfooます。regex-directed engineでは、代替|は公平ではなく、この場合の正規表現エンジンは、次のものを試す前に、前に指定されたものと一致するよう最善を尽くします。一致しない場合は、元に戻ってバックトラックします)。

上記で説明したことは、解決策ではない可能性が高いことに注意してください。データを調べて、文字の消費方法を制限する優れた機能がないかどうかを確認し、一致を区別できるようにする必要があります。

于 2013-01-17T01:22:54.853 に答える