可选的正则表达式预测

时间:2012-01-26 01:03:34

标签: javascript regex

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

作为一个简短的总结,我试图从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。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

尝试将问号放入预测:

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

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

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

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