我有这个正则表达式:
((?:website.com\/video\/)(\d+))|((?:video_id=)(\d+))
它与我需要的模式匹配得很好(例如:http://website.com/video/1337, http://website.com/video/?video_id1337)。
但有时我可能需要从网址中提取令牌(令牌并不总是存在), 所以一个示例网址是http://website.com/video/?video_id1337&token=1337video。
我有一个单独的正则表达式,可以提取令牌:/(?:token=)(\w+)/
有效,但我尝试将两个正则表达式组合在一起,第二个停止工作,这是我试图将它们分组的方式:
((?:website.com\/video\/)(\d+))|((?:video_id=)(\d+)|(?:token=)(\w+))
如何正确分组,以便它们都有效?
答案 0 :(得分:4)
你正在过度思考你的匹配。你想要匹配的是:
website.com/video/
,然后是?video_id
,其次是转换为:
website\.com/video/
(?:\?video_id)?
(\d+)
(保存到群组中)(?:[?&]token=(.*))?
(?
或&
,=
保存到群组后的所有内容)最终结果:
website\.com/video/(?:\?video_id)?(\d+)(?:[?&]token=(.*))?
答案 1 :(得分:-1)
你的正则表达式应该是
(?:website.com/video/)((\d+)|([?]video_id(\d+))([&]token=(\d+))?)
通过添加“g”修饰符
切换到全局搜索var result = mystring.match(/(?:website.com\/video\/)((\d+)|([?]video_id(\d+))([&]token=(\d+))?)/g);