2

正規表現のみのソリューションが必要だと言って始めましょう。

3番目のプログラムプログラムでhtmlファイルから説明を取得しようとしています。このプログラムは Java ベースですが、ソース コードを操作することはできません。. 正規表現を送信するプログラムには、すべてのページのどこから説明を取得するかを指定する別の正規表現スクリプトが既に含まれています。内部で一致を定義すると、その情報を配列にさらに分解するこの便利な機能があります。

リスト項目かどうかに関係なく、説明のすべての文に一致させたいです。タグを取り除くことは理想的です。なぜなら、それらは\bマッチを開始する場所を指定するのに問題を引き起こしているからです.

最初は、単語境界と文末文字の間のすべてをキャプチャする正規表現ソリューションを作成できると思っていました。のようなもの\b([^.!]+)[.!]次に、説明にリスト項目の追加部分が含まれることがあるという問題に気付きました。さらに複雑なのは、リスト項目の最初の部分が太字またはイタリック体になる場合があることです。さらにまれに、私が理解できない理由でそこにランダムなタグが含まれて<br>いる可能性があります...</br>

以下は、陽気な記事の一般的なレイアウトの説明の例です。

Children around the world are constantly exposed to the evil “Dolan”, an evil 
duckwho encourages rape, murder, pedophilia, stealing, homosexuality and a range
of other sins.  ”Dolan” is considered a “meme”: an image that makes its way
around the internet via social networks such as Myspace, Friendster, or
Wikipedia.

<li>The duck is based on the character “Donald” created by the company Disney. 
</li><li><b>Dolan, however</b>, is more overtly satanic and enjoys commit crimes
and offending Christianity. </li><li>He is best known for a series of internet 
comics created in the socialist nation of Finland. </li><li><i>Being part of
Scandinavia</i>, the Finnish are clearly followers of Satan and Skrillex. </li>
<li>The comics are written in poor English to distract the viewer from how evil
and offensive they truly are.</li>

私はいくつかの異なることを試しましたが、まだ正規表現初心者であり、正しく機能しないさまざまなリターンを得ました。これは、タグに含まれる文字から始まるすべてを分割したものです。

(?:<li>|<b>|<i>)?\b([^.!<]+)[.!< ][<lbi/ ]

上記のコードは、このような配列を提供します(順序はランダム化されるか、少なくとも私が理解できない方法で編成されます)

i>
Being Part of Scandinavia
i>
b>
Dolan, however
b>

ほぼ同一の同じものがいくつかの html タグに残る可能性があります。これli>は、単語の境界要件を満たすためだと思います。注: 以下のコードの末尾にスペースがあります

\b([^.!<]+)[.!] 

これにより、次のような配列が得られます

li>The duck is based on the character “Donald”...
li>li>b>Dolan, however/b>, is more overtly satanic...

前に言ったように、私は正規表現の初心者であり、先読みを間違って使用していることは間違いありません。

解決策を教えてください!次に何を試せばいいのかわからない。

PS、記事は私が書いたのではなく、別のウェブサイトからコピーしました。攻撃的になろうとしない

4

3 に答える 3

1

気にしない\bでください。邪魔になるだけです。ルックアラウンドも必要ありません。次の正規表現は、サンプル テキストのすべての文に正しく一致します。@icrf の正規表現と同様に、文内にあるタグはそこに残ります。それらを取り除くには、2 番目のステップが必要です。それを回避する方法はありません。

[^\s<>.!?][^<>.!?]*(?:<[^<>]+>[^<>.!?]*)*[.!?]

それを分解するには:

  1. [^\s<>.!?]空白、山かっこ、または文の句読点ではない次の文字から一致を開始します。

  2. [^<>.!?]*空白を含む望ましい文字のマッチングを継続します。

  3. <[^<>]+>: 左山かっこが見つかった場合、この部分は HTML タグとの照合を試みます。次に、非特殊文字のマッチングに戻り[^<>.!?]*ます。消費するタグや非特殊文字がなくなるまで、このようなトレードオフが続きます。

  4. 最後に[.!?]、文末の句読点に一致します。

于 2012-09-26T03:02:10.753 に答える
0
\b(?<![</])(?!>)[^.?!]+[.!?]

これにより、文の外側にある HTML タグは一致しなくなりますが、文の内側にある HTML タグは残り、削除する必要があります。正規表現のみを使用してこれを解決することの限界である連続した一致ではないため、それらなしで文を取得する方法はありません。

最初の負の後読み(?<![</])と負の先読み(?!>)は、開始点としてタグ内で一致しないようにするためにあります。

The duck is based on the character "Donald" created by the company Disney.
Dolan, however</b>, is more overtly satanic and enjoys commit crimes and offending Christianity.
He is best known for a series of internet comics created in the socialist nation of Finland.
Being part of Scandinavia</i>, the Finnish are clearly followers of Satan and Skrillex.
The comics are written in poor English to distract the viewer from how evil and offensive they truly are.

開始タグまたは終了タグが文自体の外側にある可能性があるため、内部に残っている HTML は有効な HTML ではありません (文 2 の開始のない終了太字を確認してください)。

于 2012-09-25T20:27:59.920 に答える
0

これはどう:

(?:^|(?<=[.!]))(?:</?[a-zA-Z][^>]*>)*([^<][^.!]+)(?:[.!]|$)

アイデアは、文の区切り文字から別のの区切り文字まですべてを一致させようとすることです。最初のセパレーターと一致させるために肯定的な後読み(部分) を使用して(?<=[.!])いるため、正規表現は実際にはその文字を消費せず、正しい位置に存在することを確認するだけです。

サンプル記事でこの正規表現を実行すると、次の一致が得られます。

Children around the world are constantly exposed to the evil...
  ”Dolan” is considered a “meme”: an image that makes its way...
<li>The duck is based on the character “Donald” created by...
</li><li><b>Dolan, however</b>, is more overtly satanic and...
 </li><li>He is best known for a series of internet comics created...
 </li><li><i>Being part of Scandinavia</i>, the Finnish are clearly...
 </li><li>The comics are written in poor English to distract...

結果の一致にはまだ何らかの処理 (つまり、スペースの削除とタグの削除) が必要ですが、少なくとも正規表現は文に正しく一致しているようです。

于 2012-09-25T20:16:11.170 に答える