Javascript 可选的正则表达式字符串/模式节,带和不带非捕获组

Javascript 可选的正则表达式字符串/模式节,带和不带非捕获组,javascript,regex,Javascript,Regex,以下是我想做的: 简单地看一个包含3个组的URL,$1不太重要,$2&$3是,但$2是完全可选的,包括(显然)出现时对应的反斜杠,这就是我试图使之可选的全部内容。我知道它可以/应该?属于非cap组,但它必须是吗?我已经看得够多了,现在似乎表明它不必如此。如果可能的话,我真的希望有人解释一下,这样我就可以试着完全理解它,而不是像有些人来这里寻求的那样,把一个可能的工作答案交给我简单地复制 以下是我尝试过的正则表达式字符串,充其量只能将第二个URL字符串与可选的present匹配: ^https:

以下是我想做的:

简单地看一个包含3个组的URL,$1不太重要,$2&$3是,但$2是完全可选的,包括(显然)出现时对应的反斜杠,这就是我试图使之可选的全部内容。我知道它可以/应该?属于非cap组,但它必须是吗?我已经看得够多了,现在似乎表明它不必如此。如果可能的话,我真的希望有人解释一下,这样我就可以试着完全理解它,而不是像有些人来这里寻求的那样,把一个可能的工作答案交给我简单地复制

以下是我尝试过的正则表达式字符串,充其量只能将第二个URL字符串与可选的present匹配:

^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和组3的两个URL,其中1和2是可选的,但是$2是问题所在。我已经尝试了上面所有的字符串,但还没有让它匹配字符串时,可选的不存在,我相信这一定是由于反斜杠

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

将模式的一部分设置为可选,只需添加
,最后两次尝试都可以:

您的错误是您的测试错误-您使用的是与字符串开头匹配的
^
。您需要使其与每行的开头匹配。这就是为什么你的模式永远不会匹配第二行

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


我删除了很多文本,因为它分散了问题的注意力,堆栈溢出不是一个好地方。这个问题缺少预期的结果,所以我可能答错了。你能添加预期的输出吗?应该捕获什么?什么是无效的?正如我所问的,我真的想要的不仅仅是字符串,我希望得到一个解释和答案,并举例说明如何使正则表达式的一部分成为可选的,无论是在非cap组中还是在非cap组中,并且您的字符串对我来说就像我想出的那些不起作用的字符串一样日本化。:)但是谢谢你的线!我很困惑为什么我的大部分问题/解释都被删除了,实际上如果你读了你删除的内容,它解释了为什么这个问题被问了100次,并在S.O.上给出了答案。没有人真正回答,只提供了一个字符串,但他们的问题中可能有2/3也被删除了,哈哈!)不,除非我遗漏了一些东西,否则我会针对这些字符串在循环中多次运行正则表达式,每次一个。但是,你的答案是正确的,当我转到这个问题时,我显然粘贴了我列表中的第三个正则表达式字符串,我肯定从来没有运行过,因为正如你指出的,它是正确的。我从来没有在两个问号之间加上第二个问号,那是我所缺少的。因此,对于我的问题(实际上是2/3)中主持人删除的部分,答案真的是在一个子串后面加一个问号是可选的吗?编辑:你是绝对正确的,这是我一直在做的一件错事,但这不是一个正则表达式,因为我的正则表达式100%都是单行的,但这是一个站点的事情…正则表达式101和正则表达式的固有工作方式在必要时是关键的对一个列表执行一次JS,然后是mutliline,这是我在尝试所有这些字符串时从未检查过的,因为正如您正确指出的,第二个字符串从未匹配。:)非常感谢!而且,如果我真的需要运行多行正则表达式,你现在已经教会了我我错过了什么+1.
https:\/\/([a-z]{0,2})\.?blah\.com(?:\/(.*))?\/required\/B([A-Z0-9]{9}).*