正则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两个中间团体,得到你想要的复合词。