Javascript 可选正则表达式前瞻

Javascript 可选正则表达式前瞻,javascript,regex,Javascript,Regex,我试图获得一个可选的前瞻,但遇到了一些问题,一旦我将其设置为可选(在其后面添加一个?),即使数据存在,它也不再匹配 作为一个简短的总结,我试图从URI中提取特定的querystring参数。例如: /.*foo.html\??(?=.*foo=([^\&]+))(?=.*bar=([^\&]+))/ .exec( 'foo.html?foo=true&bar=baz' ) 我会稍微解释一下: .*foo.html\?? // filename == `

我试图获得一个可选的前瞻,但遇到了一些问题,一旦我将其设置为可选(在其后面添加一个
),即使数据存在,它也不再匹配

作为一个简短的总结,我试图从URI中提取特定的querystring参数。例如:

/.*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
foo
bar
都作为参数存在于querystring中的情况下,上述示例非常有效。问题是我试图将这些设置为可选设置,因此我将其更改为:

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

它不再匹配任何参数,尽管它仍然匹配
foo.html
。有什么想法吗?

试着在“展望”部分打上问号:

...((?=(?:.*foo=([^\&]+))?)...
看起来很奇怪,但我认为一个好看的正则表达式不是目的:-)

还有,你想过这个吗

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

为什么要使用正则表达式?只需拆分字符串并将键/值对存储在一个对象中。@ThiefMaster--因为我想:),现在我想做的更多,因为它不起作用。事实上,这仅仅是因为当我只需要获得2个参数时,代码要短得多。为什么需要向前看?要匹配foo.html?bar=baz&foo=true?@Bergi-完全正确。在这一点上,我更想知道为什么上面的方法不起作用:)谢谢,第一种方法有效。我认为这是必需的,因为引擎可能完全优化了
(?=)?
(即忽略它),因为可选的不匹配正则表达式是毫无意义的。我只是碰巧用它来抓别的东西。您的第二个参数也可以工作,除了需要一些调整来使每个参数成为可选参数外,还有一点逻辑性,因为您需要找出哪个参数在哪里(您需要删除两个
?:
,然后对照它们进行检查),无论如何,使lookahead可选将导致匹配一个空字符串。