正则表达式不会忽略选项组

时间:2019-11-15 10:06:17

标签: regex

我正在尝试创建一个正则表达式来捕获我的网址和他的Optionnals组。如果网址完整,则正则表达式可以正常工作。选项组根本不是选项组。

正则表达式:

\/(.+)(?:\/(.+))(?:(?:\?(.+)))

捕获的网址:

  • /出租车
  • /出租车/里昂
  • / taxi / lyon?coordinates = 7542

https://regex101.com/r/NKFkwq/4/

如您所见,第三行被捕获。但是我也想要第一和第二。 我以为?:足以做到这一点,但我错过了一些事情……

非常感谢您的帮助! 干杯

编辑并回答

感谢您对我的帮助。这里是伟大的正则表达式(我期望的正则表达式):https://regex101.com/r/NKFkwq/8

确实?:是关于忽略一场比赛,而不是让他成为择偶。

1 个答案:

答案 0 :(得分:3)

您的模式包括捕获和非捕获组。 (?:表示一个非捕获组。

如果要匹配所有3行,则可以使用match从第一个正斜杠开始的部分,并使从第二个正斜杠开始的部分是可选的。

^/[^\s/]+(?:/[^\s/]+)?$
  • ^字符串的开头
  • /[^\s/]+匹配/并匹配除空格或/之外的任何字符的1+倍
  • (?:非捕获组
    • /[^\s/]+匹配/并匹配除空格或/之外的任何字符的1+倍
  • )?关闭非捕获组并将其设置为可选
  • $字符串结尾

Regex demo


如果您想拥有捕获组,但又不想匹配/taxi?coordinates=7542,则可以嵌套这些组并将它们设为可选。

^/\w+(/\w+(\?\S*)?)?$
  • ^字符串的开头
  • /\w+匹配/和1个以上的字符字符
  • (捕获第1组
    • /\w+匹配/和1个以上的字符字符
    • (捕获第2组
    • \?\S*匹配?并匹配0+次非空格字符
    • )?关闭第2组
  • )?关闭第1组
  • $字符串结尾

Regex demo