带有和不带非捕获组的可选正则表达式字符串/模式部分

时间:2017-04-23 08:16:40

标签: javascript regex

以下是我要做的事情: http://i.imgur.com/Xqrf8Wn.png

只需要一个包含3组的网址,1美元不是那么重要,2美元和2美元3美元但是2美元是完全可选的,包括(显然)相应的反斜杠,这是我试图做出的选择。我知道它可以/应该吗?在一个非上限组,但它必须是?我现在已经看够了似乎表明它不是必须的。如果可能的话,我真的很想让别人解释一下,这样我就可以尝试完全理解它,而不仅仅是让一个可能的工作答案交给我简单复制,就像有些人来这里寻求。

这里我的正则表达式字符串尝试过,最多只能匹配第二个URL字符串和可选的现在:

^https:\/\/([a-z]{0,2})\.?blah\.com(?:\/)(.*)\/required\/B([A-Z0-9]{9}).*
^https:\/\/([a-z]{0,2})\.?blah\.com(\/)?(.*)\/required\/B([A-Z0-9]{9}).*
^https:\/\/([a-z]{0,2})\.?blah\.com(?:\/)?(.*)?\/required\/B([A-Z0-9]{9}).*

以下是我要捕获第2组和第2组的两个网址。 3,1和2是可选的,但2美元是问题。我已经尝试了上面的所有字符串,并且当可选项不存在时还没有让它与字符串匹配,我相信它必须是由于反斜杠?

https://blah.com/required/B7BG0Z0GU1A
https://blah.com/optional/required/B7BG0Z0GU1A

1 个答案:

答案 0 :(得分:1)

使模式的一部分可选,就像添加?一样简单,最后两次尝试都有效:https://regex101.com/r/RIKvYY/1

您的错误是您的测试错误 - 您使用的^字符串的开头相匹配。您需要add the /m flag (multiline)才能使其与每行的开头匹配。这就是你的模式永远不会与第二行匹配的原因......

请注意,您允许使用两个斜杠(例如//required)。您可以通过将第一个斜杠和可选部分连接到同一个捕获组来解决它(当然,只要您使用.*,您仍然可以匹配多个斜杠):

https:\/\/([a-z]{0,2})\.?blah\.com(?:\/(.*))?\/required\/B([A-Z0-9]{9}).*