正则expression式匹配困难

我目前的正则expression式:

([\d]*)([^\d]*[\d][az]*-[\d]*)([\d][az?])(.?) 

所以我试图使正则expression式匹配一个string基于:计数,可以是任何数量的数量从0至100万,然后是一个数字,然后有时一个字母然后 – 然后任何数字的数字后跟相同的数字,有时一封信,有时一封信。 它应该匹配的string的例子:

 1921-1220104081741b 192123212a-1220234104081742ab 

一个基于上面应该返回的例子(这是两个例子,它不应该读两条线)。

 (192) (1-122010408174) (1) (b) (19212321) (2a-122023410408174) (2a) (b) 

我当前的正则expression式和第二个正则expression式一样,但是当我希望它返回(1)(b)时,返回(1b),而在第二个情况下返回(2a),或者返回

 1926h-1220104081746h Should Return: (192) (6h-122010408174) (6h) 

不是100%肯定,如果可能的话,我觉得我是相当新的正则expression式。 作为参考,我在excel-vba中做这个,如果还有其他方法可以做到这一点的话。

您可以在短划线字符之前捕捉字符,然后返回引用该匹配的字符。

在下面的expression式中, \3将匹配第三个捕获组匹配的内容:

 (\d*)((\d[az]*)-\d*)(\3)([az])? 

示例在这里

在这里输入图像说明

合并捕获组后的输出:

 1921-1220104081741b (192) (1-122010408174) (1) (b) 
 192123212a-1220234104081742ab (19212321) (2a-122023410408174) (2a) (b) 
 1926h-1220104081746h (192) (6h-122010408174) (6h) 

例:

不理会JS。 以下是合并捕获组后的输出:

 var strings = ['1921-1220104081741b', '192123212a-1220234104081742ab', '1926h-1220104081746h'], exp = /(\d*)((\d[az]*)-\d*)(\3)([az])?/; strings.forEach(function(str) { var m = str.match(exp); snippet.log(str); snippet.log('(' + m[1] + ') ('+ m[2] + ') (' + m[4] + ') (' + (m[5]||'') + ')'); snippet.log('---'); }); 
 <script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> 

我觉得你跟“跟着同一个号码”的意思是,在短划线之前的那个片断被重复作为你的第三个捕获组。 我build议通过分割你的第二个捕获组,然后使用反向引用来实现这个:

 ([\d]*)([\d][az]*)-([\d]*)(\2)(.?) 

对于你的三个例子:

 1921-1220104081741b 192123212a-1220234104081742ab 1926h-1220104081746h 

这导致:

 (192) (1) - (122010408174) (1) (b) (19212321) (2a) - (122023410408174) (2a) (b) (192) (6h) - (122010408174) (6h) () 

…你可以join两个中间团体,得到你想要的复合词。