我真的很难使用单个正则表达式解析GitHub回购名称并从分支引用中发出数字。我看到了一种方法,我可以使用3或4个正则表达式和相当数量的代码,但我更喜欢1,特别是因为我感觉有类似的事情已经完成。我在http://regex101.com/#javascript玩了一会儿,似乎无法在那里玩。
此正则表达式适用于第一组测试字符串:/(\S+\/\S+)?#(\d+)/i
而这个正则表达式是我在第二组中最好的刺,但不起作用:/(_|-|^)?(\d+)(_|-|$)?/
。如果第二个工作,我会很好,然后我可以分别完成它们,但似乎无法实现它。
这是我需要匹配的内容。下面是一些测试字符串,在评论之后,是所需的匹配组。
'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
真的很感激帮助。我不会说我是正则表达式的新手,因为我已经完全使用单个正则表达式编写了一个简单语言的标记化器,但绝对不是专业人士。如果我也以错误的方式解决这个问题,请告诉我。
干杯!
答案 0 :(得分:0)
/^(?:(\S+\/\S+)?#(\d+)\w*|(?:ok ?)?(\d+)[-_]?\w*?|\w*?[-_]?(\d+)(?: ?ok)?)$/
对于第一组,它返回1和2,对于第二组,它返回3或4中的数字。
答案 1 :(得分:0)
这似乎与你想要的方式相符:
/(?|([a-z-\.]+\/[a-z-\.]+)?(#\d+)|($)?(?:^|-|_)(\d+)|($)?(\d+)(?:$|-|_))/gmi
请在此处查看:Regex101
编辑:没有看到它被javascript标记,javascript不支持(?|),所以这是一个有效的解决方案(基于你的例子):
/^(?:[a-z\.\/]+\d+[a-z\.\/]+)$|(?:([a-z\.-]+\/[a-z\.-]+)(?=#))?(#?\d+)/gmi
第一部分^(?:[a-z\.\/]+\d+[a-z\.\/]+)$
,“吃”无效行。
第二部分(?:([a-z\.-]+\/[a-z\.-]+)(?=#))
匹配abc/def
后跟#
最后一部分(#?\d+)
匹配一个或零#
后跟一个或多个数字。
请在此处查看:Regex101