Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于分析GitHub分支ref的正则表达式_Javascript_Regex_Github Api - Fatal编程技术网

Javascript 用于分析GitHub分支ref的正则表达式

Javascript 用于分析GitHub分支ref的正则表达式,javascript,regex,github-api,Javascript,Regex,Github Api,我真的很难用一个正则表达式来解析一个GitHub回购名称和分支引用的发行号。我看到了一种方法,我可以用3个或4个正则表达式和相当数量的代码来解析,但我更喜欢1,特别是因为我觉得已经做了类似的事情。我玩了一段时间,似乎没能达到目的 此正则表达式适用于第一组测试字符串:/(\S+\/\S+)?(\d+)/i 这个正则表达式是我在第二组中的最佳尝试,但不起作用:/(124;-|^)?(\ d+)(124;-|$)?/。如果第二个有效,我甚至会很好,然后我就可以分别运行这两个程序,但似乎无法实现 这是我

我真的很难用一个正则表达式来解析一个GitHub回购名称和分支引用的发行号。我看到了一种方法,我可以用3个或4个正则表达式和相当数量的代码来解析,但我更喜欢1,特别是因为我觉得已经做了类似的事情。我玩了一段时间,似乎没能达到目的

此正则表达式适用于第一组测试字符串:
/(\S+\/\S+)?(\d+)/i

这个正则表达式是我在第二组中的最佳尝试,但不起作用:
/(124;-|^)?(\ d+)(124;-|$)?/
。如果第二个有效,我甚至会很好,然后我就可以分别运行这两个程序,但似乎无法实现

这是我需要的。下面是一些测试字符串和注释后的所需匹配组

'ex-owner/ex.repo#28'       // 1: ex-owner/ex.repo, 2: #28
'#28'                       // 1: null, 2: #28
'other>owner/repo#28stuff'  // 1: owner/repo, 2: #28
'other#39stuff'             // 1: null, 2: #28
'dont/match39me'            // no match

'123'                       // 1: null, 2: 123
'123myfeature'              // 1: null, 2: 123
'myfeature456'              // 1: null, 2: 456
'blah-123 ok'               // 1: null, 2: 123
'ok123-blah'                // 1: null, 2: 123
'ok123_blah'                // 1: null, 2: 123
'blah_123ok'                // 1: null, 2: 123
'not82valid'                // no match
'not.82.valid'              // no match
非常感谢你的帮助。我不会说我是regex的新手,因为我已经用一个regex为一种简单的语言编写了一个标记器,但绝对不是专业人士。如果我也走错了方向,请告诉我

干杯

/^(?:(\S+\/\S+)(\d+)\w*|(?:ok?(\d+)[-\u]?\ w*?\w*?[-\u]?(\ d+(:?ok?)$/


对于第一组,它返回1和2,对于第二组,它返回3或4中的数字。

这似乎与您想要的方式相匹配:

/(?|([a-z-\.]+\/[a-z-\.]+)?(#\d+)|($)?(?:^|-|_)(\d+)|($)?(\d+)(?:$|-|_))/gmi
在这里查看:

编辑:没有看到它是用javascript标记的,(?|)在javascript中不受支持,因此这里有一个可行的解决方案(基于您的示例):

其中第一部分,
^(?[a-z\.\/]+\d+[a-z\.\/]+)$
“吃”无效行

其中第二部分,
(?:([a-z\.-]+\/[a-z\.-]+)(?=#))
abc/def
匹配,后跟一个

最后一部分,
(#?\d+
)匹配一个或零个
#
,后跟一个或多个数字


查看此处:

'ex-owner/ex.repo#28'/1:owner/repo这不可能,因为您无法从匹配的“owner/ex.repo”中删除“ex.”。您是对的,这是我的一个输入错误。固定的
/^(?:[a-z\.\/]+\d+[a-z\.\/]+)$|(?:([a-z\.-]+\/[a-z\.-]+)(?=#))?(#?\d+)/gmi