2011-06-25 4 views
1

文字列の最初の文と一致する正規表現を出そうとしています。あまりに複雑すぎるものは必要ありません。「。」や「!」や「?」で終わる文だけが後にスペースを書き留めるので、「私はこのdomain.comが必要です!」という文が一致します。私はregexlib.comで何も見つけられませんでした。 は、これまでのところ、私はこれにこだわっている:それは本当に働いていない文字列の最初の文にマッチする正規表現が必要です

([^.|?|!]*)[\.\s\?\s\!\s] 

。試してみると

"I need this domain.com! Another sentence. And another sentence." 

「私はこのドメインが必要です」 "私はこのdomain.comが必要です!"

+0

どの言語?私は正規表現がここに行く正しい方法があるとは思わない。 –

答えて

5

これを試してみてください:

^.*?[\.!\?](?:\s|$) 
+0

ありがとう、これは私が必要としたものです。 – Caballero

+0

私はそれを受け入れますが、何らかの理由で私は待たなければなりません。それに、公正にしよう、私は正解だけを受け入れる。 – Caballero

+0

''これは最初の(例えば1番目の)文です。そして2番目のもの。 " –

0

がテストしていませんが、これはそれが

^([^.|?|!]+) 

問題をすべきでは+が一致したのに対し、*、ゼロ個以上の文字と一致していることである少なくとも一つのchar

0

(私はそれが私が知っているので、Javaの正規表現の構文で書くつもりです;使用している他の正規表現システムと同じでなければなりませんが、私は100%確信していません)

文境界の正規表現は明らかに[.!?]\sです。だから、最初のものまですべてをマッチさせたい。 "+"は貪欲にマッチし、最後の文の始めまでのすべてをマッチさせます。あなたは消極的キャプチャをしたい:ここ

(.+?)[.!?]\s

2

も卍の答えに括弧についてビタリPonomarさんのコメントに対処しながら、元のテストに合格するパターンです。

^.*?[.!?](?:\s|$)(?!.*\)) 

これは効果的に言ってnegated lookaheadを使用しています、初めにスタート

  1. をし、任意の文字に一致する任意の回数が、可能な限り数回として、まだ次が成り立つことを可能にします。空白文字またはが、その何が続いないライン
  2. の終わりを:それは続いています.または?または!
  3. :我々は、これらの文字のいずれかを参照してください
  4. )閉じ括弧の文字になります。

これは、括弧グループがどこでバランスが取れているかを知るという事実を利用しています。

"文頭の先頭"に大文字が含まれている必要があることをアサートすることで、ある程度の保護を追加することができます。ほとんどのプログラムでは、括弧が適切にそれらの中にバランスされて確実に対それらを連結する前に、文字列を大文字に非常に容易である、ので、これは望ましい

^.*?[.!?](?:\s[A-Z]|$)(?!.*\)) 

理由があります。

non-capturingグループを使用して回答が受け入れられたため、(?:foo)のように、私も使用しました。これにより、 "文の先頭"マーカーがマッチに含まれます。空白文字のみを使用するのか、大文字小文字を追加するのかに応じて、この処理が必要な場合としない場合があります。

私はこれを含まないことをお勧めします。(?=foo)のようにlookaheadを代わりに使用することをおすすめします。

^.*?[.!?](?=\s[A-Z]|$)(?!.*\)) 

今、私たちは試合中に嫌なものを含めていないこと、のスペースが、何も私たちの最初の文の後がない場合の世話をしてみましょう:

^.*?[.!?](?=\s[A-Z]|\s?$)(?!.*\)) 

これで今いくつかのテストはかなりまともなパターン:

  • 入力は: "!私はもう一つの文章をこのdomain.comを必要とし、別の文。。"

    :「私はこのdomain.comが必要です!」

  • 入力: "これは最初の(たとえば1番目の)文であり、2番目の文です。"

    」:「これは最初の文章です」。

  • 入力: "。これは、壊れた(例えば第一文で2つ目"

    マッチ: "これは壊れ(例えば第一文である。"

  • 入力: "これは私を...アップトリップ最もだがません。。"

    マッチ: "これは...ほとんどをトリップします。"

素晴らしい。しかし、これはまだ落ちる場所があります。例:引用符。文は複雑です!これを正しく行うには、指定された言語の句読ルール全体を考慮に入れ、誰もが常に完全に従うと仮定しないアルゴリズムを思いつき、奇妙なマッチを導入せずに特定の部品をオプションにする必要があります。そのルートを終了すると、greed operators(疑問符?の特定の用途)がたくさんある長い判読不能な表現になります。

結局のところ、プログラムの入力がどこから来ているのか、複雑なパターンマッチングを適用する前に前処理できることがほとんどです。小さくて簡単なパターンの複数のパスを実行することは、より信頼性が高く読みやすいですが、パフォーマンスは低下します。あなたが気にしないもの(改行やその他の空白文字など)を削除したり、重複しないようにしたり、悪意のある入力の可能性のある痕跡を削除するもの...など。入力が単純​​化するにつれて、ゆっくりと複雑になります。

+1

ありがとう!私の頭を壁に打ちつけて、私の既存の正規表現を修正しようとした後、 "D." "D.C."文の真ん中にそれの終わりがありました、私は最終的にあなたの正規表現を見つけました。これはかなり単純なケースを扱う唯一のものでした! – JoLoCo

関連する問題