2012-01-12 10 views

答えて

15

VS

(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello-world" "you"] 

?は、+として数量、非貪欲になります。デフォルトでは、彼らは貪欲です。

  • 貪欲:(.+)
  • 非貪欲:(.+?)

ところで、これはちょうど、直接、シンプル、およびへのポイントの答えです。 @ fgeの答えは、のほうが良いと言います。それをやる方法。将来の表現のためにそれをチェックしてください。 .+を使用しないでください

12

は、補完文字クラスを使用します。これは、すべての貪欲を気にする必要がなくなります。

あなたは正規表現としてこれを使用している必要があります:([^-]+)-([^-]+)

入力を可能な限り修飾するよう常に努力してください。ここでは、ダッシュではないすべてのものを1つ以上にマッチさせ、それをキャプチャしたい場合はダッシュ(-)、次にダッシュではないものを1回以上キャプチャしてキャプチャします(([^-]+) )。

の入力がに依存していないことがわかっている場合は、量的限定子の(非)貪欲に頼ることが基本的なエラーです。エラーの原因であるだけでなく(あなた自身が実証しているように)、正規表現エンジンが最大限の効率で実行することも妨げになります。

+0

実際、怠惰な表現は、怠け者のためのものです。しかし、怠け者でなければ、正規表現を使用する代わりに文字配列と 'for'ループを使用します。 – FakeRainBrigand

+1

それは問題ではありません。これは不正な正規表現の習慣です。私は正規表現のサイトの85 +%はそれをお勧めしますが、85 +%のサイトはちょうど_wrong_です。 – fge

+0

(+1)私は同意します。私は自分の答えを更新しました。 – FakeRainBrigand

関連する問題