【问题标题】:Regex matching a string pattern and number ( url format )匹配字符串模式和数字的正则表达式(url格式)
【发布时间】:2017-11-05 19:59:28
【问题描述】:

我有一个遵循这个 url 模式的字符串

https://www.examples.org/activity-group/8712/activity/202803
// note :  the end ending of the url can be different
https://www.examples.org/activity-group/8712/activity/202803‌​?ref=bla
https://www.examples.org/activity-group/8712/activity/202803‌​/something

我正在尝试编写一个匹配的正则表达式

https://www.examples.org/activity-group/{number}/activity/{number}*

其中 {number} 是长度为 1 到 10 的整数。

如何定义一个正则表达式来检查字符串模式并检查数字是否在字符串中的正确位置?

背景:在 Google 表单中,为了验证答案,我想强制人们以这种格式输入 url。因此使用了这个正则表达式。

对于不匹配该格式的 URL,正则表达式应返回 false。例如:https://www.notthesite.org/group/8712/activity/astring

我浏览了几个示例,但它们仅在字符串中存在数字时才匹配。

示例来源:

【问题讨论】:

  • 展示你的最佳尝试。
  • 抱歉,我不明白为什么https://www\.examples\.org/activity-group/\d{1,10}/activity/\d{1,10}$ 没有帮助

标签: javascript regex google-forms


【解决方案1】:

^https:\/\/www\.examples\.org\/activity-group\/[0-9]{1,10}\/activity\/[0-9]{1,10}(\/[a-z]+)*((\?[a-z]+=[a-zA-Z0-9]+)(\&[a-z]+=[a-zA-Z0-9]+)*)*$

  • ^ - 字符串开头
  • \ - 转义字符
  • [0-9] - 一个数字
  • {1,10} - 前一项到十项之间
  • (\/[a-z]+)* - 允许额外的 URL 段
  • ((\?[a-z]+=[a-zA-Z0-9]+)(\&[a-z]+=[a-zA-Z0-9]+)*)* - 允许使用? 的第一个参数和所有其他使用& 的查询参数
  • $ - 字符串结束

这是假设 URL 段和查询参数键仅为小写字母。查询参数值可以是小写字母、大写字母或数字。

【讨论】:

  • 谢谢 Alec,我忘了说些什么,url 的结尾可以不同 https://www.examples.org/activity-group/8712/activity/202803?ref=blahttps://www.examples.org/activity-group/8712/activity/202803/something 。怎么搭配?
  • @RaymondChnon 已编辑
  • 再次感谢。我试过 [这里][regex101.com/r/QINDkA/1/] ,与 activity/202803‌​?ref=bla 匹配的那个。但另一个没有:activity/202803‌​activity/202803‌​/something
  • @RaymondChenon 我错过了最后一个*,已修复。
【解决方案2】:

你可以使用

https?:\/\/(?:[^/]+\/){2}(\d+)\/[^/]+\/(\d+)

a demo on regex101.com


分解,这说:
https?:\/\/     # http:// or https://
(?:[^/]+\/){2}  # not "/", followed by "/", twice
(\d+)           # 1+ digits
\/[^/]+\/       # same pattern as above
(\d+)           # the other number

您需要分别使用群组12


如果这过于宽松,请使用
https:\/\/[^/]+\/activity-group\/(\d+)\/activity\/(\d+)

读取

https:\/\/[^/]+     # https:// + some domain name
\/activity-group\/  # /activity-group/
(\d+)               # first number
\/activity\/        # /activity/
(\d+)               # second number

查看另一个demo on regex101.com

【讨论】:

  • 您的解决方案是智慧的结晶。我认为它太宽松了,我砍了一点。我的最终解决方案是https:\/\/www\.examples\.org\/activity-group\/(\d+)\/activity\/(\d+)
  • @RaymondChenon:很高兴能提供任何帮助。
【解决方案3】:

可能你需要类似的东西:

(http[s]?:\/\/)?www.examples.org\/activity-group\/(\d{1,10})\/activity\/(\d{1,10})([\S]+?)$

地点:

  • (http[s]?:\/\/)? 匹配任何 http://https:// 部分。
  • www.examples.org 是您的域名。
  • (\d{1,10}) 将匹配最大 len 为 10 的第一个整数(在 activity-group 之后)。
  • 第二个(\d{1,10}) 将匹配activity之后的第二个整数。
  • 最后([\S]+?)$ 将匹配第二个数字之后的任何可选数据,直到找到新行,假设您将多行标志与\m 一起使用。

查看http://regexr.com/3h448

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多