0

我有这个正则表达式:

((?:website.com\/video\/)(\d+))|((?:video_id=)(\d+))

它与我需要的模式很好地匹配(例如:http : //website.com/video/1337、http://website.com/video/ ?video_id1337)。

但是有时我可能需要从 url 中提取令牌(令牌并不总是存在),因此示例 url 将是http://website.com/video/?video_id1337&token=1337video

我有一个单独的正则表达式可以提取令牌:/(?:token=)(\w+)/它有效,但我尝试将两个正则表达式组合在一起,第二个停止工作,这就是我尝试将它们分组的方式:

((?:website.com\/video\/)(\d+))|((?:video_id=)(\d+)|(?:token=)(\w+))

我怎样才能正确地将它们分组,以便它们都可以工作?

4

2 回答 2

4

你想太多你的匹配。你要匹配的是:

  1. website.com/video/, 其次是
  2. 也许 ?video_id,其次
  3. 视频的 ID 号,后跟
  4. 也许是一个象征

这转换为:

  1. website\.com/video/
  2. (?:\?video_id)?
  3. (\d+)(保存到一个组)
  4. (?:[?&]token=(.*))??或者,保存到组&之后的所有内容)=

最终结果:

website\.com/video/(?:\?video_id)?(\d+)(?:[?&]token=(.*))?
于 2013-09-17T13:56:37.583 回答
-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);
于 2013-09-17T14:05:20.230 回答