1

正規表現を使用して html ドキュメントを検索するサード パーティのアプリを使用しています。この場合、適切な構造 (ヘッドまたはボディなし) がなく、Excel ファイルのプロパティの形式として一致を返します。それらを解析しません。私は、html を正規表現で解析しようとすることによって引き起こされる恐怖をすでに知っています。

そのため、段落またはリスト項目内のすべての文をキャプチャすることになっている正規表現を作成しましたが、一致を確認した後、すべての文と一致しない場合があり、その文またはリスト項目でエラーが発生すると一致が停止することに気付きました。ほとんどの場合、リスト アイテムを使用しますが、文を使用することもあります。これが人的エラーによるものであることに気付いた後、オプションの非キャプチャ グループを追加して、すべてを完全に台無しにしました。

これは私が書いた最初の正規表現で、ほとんどの場合に機能しました。

([^<>]*?)[.!?<]|[ <"'/]

一部のセンテンスで、ライターが句読点の前にスペースを入れるというエラーが発生したため、オプションの非キャプチャ グループを追加しました。

([^<>]*?)(?:[ ])?[.!?<]|[ <"/l]

検索されたテキストの例を次に示します。

Buy this because it is soooooooooooooooooooo freaking awesome! If you buy this 
everyone will think you're "cool." You'll get all the babes !<br><br><ul><li>It 
will make you smell better<li>It will make you preform better.</li><li>Will make
you last longer in bed!<li>Will fix any acne problem.</li> <li>It will reduce the
amount you perspire to .01% your normal amount!<br><li>It will make you 
"invincible."</li></ul>

それらはアンカーとして使用するものではないため(テキストはhtmlファイルの先頭から始まります)、すぐにキャプチャを開始しました。ご覧のとおり、コーディングが不十分で文法エラーがあるため、このように終了しました。

最初のものはほとんどすべての文をキャプチャしましたが、一部を省略しました... 2番目のものは、キャプチャで作成された配列を台無しにするnull一致の空白の束を返します。非捕獲群以降を無視してるようなものです。

私はこのようにすることを考えましたが、これはすべての単語を一致として返しました:

([^<>]*?)[ .!?<]|[ .!?<"/l]

唯一の問題は、これによりいくつかの文が途中で切り取られ、3 番目の範囲が必要になり、さまざまなオプション (ランダム<br>タグに注意してください) がたくさんあり、それらをすべて見つけるのに時間がかかることでした。

見た目からして、オプションの非攻略組は使っていません!どうしてこれなの?それとも、非常に単純なものを見落としていますか?多分後者だと思います。

4

1 に答える 1

3

私はこの獣を思いついた:

(?:^|\s+|>)((?:[^<>.!?\s])(?:[^<>.!?]|\.\d)+(?:\.(?!\d)"?|!|\?)?)

私がここで何をしているのか説明してみましょう。

(?:^|\s+|>)       # only start after at the string's beginning, after a row of
                  # spaces, or after closing a tag
                  # this eliminates all in-tag matches (like "li" and "br")
(                 # opening a capturing group that will contain the actual match
(?:[^<>.!?\s])    # require at least one character that is not in the given group
                  # this eliminates matching a single space between two <li>s
                  # NOTE: there are probably better ways to do this
(?:[^<>.!?]|\.\d) # defines possible sentence characters; allow everything but
                  # <, >, ., !, ? EXCEPT FOR . followed by a digit
(?:\.(?!\d)"?|!|\?)?
                  # include possible sentence endings; that is . not followed by
                  # a digit (hence, the negative lookahead), but possibly
                  # followed by ", or !, or ?, or nothing at all
)                 # close the main matching group

これで、キャプチャされたインデックスで文章にアクセスできるようになります1

文がどのように見えるかについての私の仮定が壊れている場合があると思います。しかし、私はあなたが与えた例からしか作業できませんでした、そしてそのすべての奇妙なことが含まれています。

于 2012-10-10T19:53:58.687 に答える