可选的正则表达式预测

Mar*_*ahn 9 javascript regex

我正在尝试获得一个可选的前瞻但是我遇到问题,只要我将其设为可选(?在它之后添加一个),即使数据存在也不再匹配.

作为一个简短的总结,我试图从URI中提取特定的查询字符串参数.例:

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

我会稍微突破一点:

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

以上示例在条件下完美地工作,foo并且bar在查询字符串中作为参数存在.问题是我正在尝试使这些可选,所以我将其更改为:

/.*foo.html\??(?=.*foo=([^\&]+))?(?=.*bar=([^\&]+))?/
                                ?                  ?
    Added these question marks ?????????????????????
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 4

尝试将问号放入前瞻中:

...((?=(?:.*foo=([^\&]+))?)...
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪,但我认为漂亮的正则表达式不是目的:-)

另外,你有没有想过这个问题?

/.*foo.html\??.*(?:foo|bar)=([^\&]+).*(?:bar|foo)=([^\&]+)/
Run Code Online (Sandbox Code Playgroud)