2012-01-26 19 views
9

私はオプションの先読みを取得しようとしていますが、オプションで(すぐ後に?を追加して)すぐに問題が発生しました。オプションの正規表現先読み

簡単な要約として、URIから特定のクエリ文字列のパラメータを取り出そうとしています。例:

/.*foo.html\??(?=.*foo=([^\&]+))(?=.*bar=([^\&]+))/ 
    .exec('foo.html?foo=true&bar=baz') 

私は少しそれを破るよ:

.*foo.html\??  // filename == `foo.html` + '?' 
(?=.*foo=([^\&]+)) // find "foo=...." parameter, store the value 
(?=.*bar=([^\&]+)) // find "bar=...." parameter, store the value 

上記の例はfoobarの両方がクエリ文字列内のパラメータとして存在することを条件に完璧に動作します。問題は、私はこれらをオプションにしようとしているということですので、私はそれを変更:

/.*foo.html\??(?=.*foo=([^\&]+))?(?=.*bar=([^\&]+))?/ 
           ↑     ↑ 
    Added these question marks ─┴──────────────────┘ 

、それはまだfoo.htmlと一致するものの、それはもはや、任意のパラメータと一致しません。何か案は?

+0

なぜ正規表現を使用していますか?単に文字列を分割し、キー/値のペアをオブジェクトに格納するだけです。 – ThiefMaster

+0

@ThiefMaster - 私はしたいので:)そして、私はもっと今、それがうまくいかないと思っています。実際には、2つのパラメータを取得するだけでコードが大幅に短くなるためです。 –

+0

なぜ先読みが必要ですか? foo.html?bar = baz&foo = trueも一致させるには? – Bergi

答えて

4

は先読みに疑問符を配置しようとすると:

...((?=(?:.*foo=([^\&]+))?)... 

は奇妙に見えますが、私は格好良い正規表現はまた

:-)目的ではなかったと思う、あなたを持っていますこれについて考えましたか?

/.*foo.html\??.*(?:foo|bar)=([^\&]+).*(?:bar|foo)=([^\&]+)/ 
+1

ありがとうございます、最初の作品です。オプションの一致しない正規表現は無意味なので、エンジンが '(?=)?'を完全に最適化している(つまり無視している)かもしれないので、これは必須です。私はちょうど他のものをキャッチするためにそれを使用している。あなたの2番目のものは、それぞれのparamをオプションにするためにいくつかの微調整が必​​要であることを除いて、あまりにもうまくいくでしょう。そして、どのparamがどこにあるのか把握する必要があるので、少し後の論理があります。 : ''がそれらと照合する) –

+0

とにかく、先読みをオプションにすると、空文字列に一致することになります。 – Bergi

関連する問題