も卍の答えに括弧についてビタリPonomarさんのコメントに対処しながら、元のテストに合格するパターンです。
^.*?[.!?](?:\s|$)(?!.*\))
これは効果的に言ってnegated lookaheadを使用しています、初めにスタート
- をし、任意の文字に一致する任意の回数が、可能な限り数回として、まだ次が成り立つことを可能にします。空白文字またはが、その何が続いないライン
- の終わりを:それは続いています
.
または?
または!
- :我々は、これらの文字のいずれかを参照してください
)
閉じ括弧の文字になります。
これは、括弧グループがどこでバランスが取れているかを知るという事実を利用しています。
"文頭の先頭"に大文字が含まれている必要があることをアサートすることで、ある程度の保護を追加することができます。ほとんどのプログラムでは、括弧が適切にそれらの中にバランスされて確実に対それらを連結する前に、文字列を大文字に非常に容易である、ので、これは望ましい
^.*?[.!?](?:\s[A-Z]|$)(?!.*\))
理由があります。
non-capturingグループを使用して回答が受け入れられたため、(?:foo)
のように、私も使用しました。これにより、 "文の先頭"マーカーがマッチに含まれます。空白文字のみを使用するのか、大文字小文字を追加するのかに応じて、この処理が必要な場合としない場合があります。
私はこれを含まないことをお勧めします。(?=foo)
のようにlookaheadを代わりに使用することをおすすめします。
^.*?[.!?](?=\s[A-Z]|$)(?!.*\))
今、私たちは試合中に嫌なものを含めていないこと、のスペースが、何も私たちの最初の文の後がない場合の世話をしてみましょう:
^.*?[.!?](?=\s[A-Z]|\s?$)(?!.*\))
これで今いくつかのテストはかなりまともなパターン:
入力は: "!私はもう一つの文章をこのdomain.comを必要とし、別の文。。"
:「私はこのdomain.comが必要です!」
入力: "これは最初の(たとえば1番目の)文であり、2番目の文です。"
「」:「これは最初の文章です」。
入力: "。これは、壊れた(例えば第一文で2つ目"
マッチ: "これは壊れ(例えば第一文である。"
入力: "これは私を...アップトリップ最もだがません。。"
マッチ: "これは...ほとんどをトリップします。"
素晴らしい。しかし、これはまだ落ちる場所があります。例:引用符。文は複雑です!これを正しく行うには、指定された言語の句読ルール全体を考慮に入れ、誰もが常に完全に従うと仮定しないアルゴリズムを思いつき、奇妙なマッチを導入せずに特定の部品をオプションにする必要があります。そのルートを終了すると、greed operators(疑問符?
の特定の用途)がたくさんある長い判読不能な表現になります。
結局のところ、プログラムの入力がどこから来ているのか、複雑なパターンマッチングを適用する前に前処理できることがほとんどです。小さくて簡単なパターンの複数のパスを実行することは、より信頼性が高く読みやすいですが、パフォーマンスは低下します。あなたが気にしないもの(改行やその他の空白文字など)を削除したり、重複しないようにしたり、悪意のある入力の可能性のある痕跡を削除するもの...など。入力が単純化するにつれて、ゆっくりと複雑になります。
どの言語?私は正規表現がここに行く正しい方法があるとは思わない。 –