2016-06-18 6 views
0

を否定しました。私は答えhereを使用して問題を解決しているように見えるが、これは私が始めたもので、それが動作しない理由を私は思ったんだけど:は、私は<em>が</em>パターン<code>name (CA)</code>または<code>barbaz (UK)</code>に合わない文字列に一致するようにしようとしている先読み混乱

var r1 = /^.+(?!\([A-Z]{2}\))$/; 

r1.test('foo'); //true 

r1.test('foo (US)'); //whoops -also true 

否定先読みdocを読んでから、私はどんなことを期待していました例えば、後に続く文字列(JP)が一致し、のいずれかがであり、それに続いて(DE)は失敗します。 (前者のみが満たされている)。

は、私はおそらく .+は一種の、すべてを「消費する」先読みを無効化していたと思ったので、私が一致する foo(のようなものが必要しかし、私は
r2 = /^[^()]+(?!\([A-Z]+\))$/; 

r2.test('name (US)'); //false 

r2.test('foo('); //whoops -also false 

を試してみました。

私の最初の試みはなぜ失敗しましたか?

答えて

1

最初の式では、.+が文字列全体を消費し、先読みがテストされます。文字が残っていないので、一致しません。あなたの目標を達成するために、/^(?!.+\([A-Z]{2}\)$).+$/を使用することができます - 最初に不要な構成要素が存在しないことを確認してから、一致します。

サンプルをhttps://regex101.com/r/aG7xZ0/1に表示

+0

ありがとうございます。あなたは$の使い方を詳しく説明できますか? – KnewB

+1

'(XX)'は文字列の最後にのみ一致し、途中ではないので、 'Hello(XX)World'が有効であることを保証するために使用されます。 –

+0

私は先読みの内側をカバーしていると思いますが、最後に '。+ $'がありますか? – KnewB

関連する問題

 関連する問題