我正在尝试创建一个正则表达式来捕获我的网址和他的Optionnals组。如果网址完整,则正则表达式可以正常工作。选项组根本不是选项组。
正则表达式:
\/(.+)(?:\/(.+))(?:(?:\?(.+)))
捕获的网址:
https://regex101.com/r/NKFkwq/4/
如您所见,第三行被捕获。但是我也想要第一和第二。 我以为?:足以做到这一点,但我错过了一些事情……
非常感谢您的帮助! 干杯
编辑并回答
感谢您对我的帮助。这里是伟大的正则表达式(我期望的正则表达式):https://regex101.com/r/NKFkwq/8
确实?:是关于忽略一场比赛,而不是让他成为择偶。
答案 0 :(得分:3)
您的模式包括捕获和非捕获组。 (?:
表示一个非捕获组。
如果要匹配所有3行,则可以使用match从第一个正斜杠开始的部分,并使从第二个正斜杠开始的部分是可选的。
^/[^\s/]+(?:/[^\s/]+)?$
^
字符串的开头/[^\s/]+
匹配/
并匹配除空格或/
之外的任何字符的1+倍(?:
非捕获组
/[^\s/]+
匹配/
并匹配除空格或/
之外的任何字符的1+倍)?
关闭非捕获组并将其设置为可选$
字符串结尾如果您想拥有捕获组,但又不想匹配/taxi?coordinates=7542
,则可以嵌套这些组并将它们设为可选。
^/\w+(/\w+(\?\S*)?)?$
^
字符串的开头/\w+
匹配/
和1个以上的字符字符(
捕获第1组
/\w+
匹配/
和1个以上的字符字符(
捕获第2组 \?\S*
匹配?
并匹配0+次非空格字符)?
关闭第2组)?
关闭第1组$
字符串结尾