我当前的正则表达式:
([\d]*)([^\d]*[\d][a-z]*-[\d]*)([\d][a-z?])(.?)
是的,所以我试图让正则表达式匹配一个基于以下内容的字符串:一个数字,可以是0-1百万的任意数量,然后是数字,然后有时候是一个字母 - 然后是数字的任何数字,然后是相同的数字,有时是一封信,有时候是一封信。它应匹配的字符串示例:
1921-1220104081741b
192123212a-1220234104081742ab
基于上面应该返回的示例(这是2个示例,它不应该读取两行。)
(192) (1-122010408174) (1) (b)
(19212321) (2a-122023410408174) (2a) (b)
我当前的正则表达式适用于第二个,但是当我希望它返回(1)(b)时它返回(1b)但是在第二个或者是第二个的情况下返回(2a) :
1926h-1220104081746h Should Return: (192) (6h-122010408174) (6h)
不是100%确定它是否可能,感觉我对正则表达式来说相当新。作为参考我在excel-vba中这样做,如果还有其他方法可以更容易地做到这一点。
答案 0 :(得分:4)
您可以捕捉破折号字符前的字符,然后再匹配匹配的参考号。
在下面的表达式中,\3
将匹配第三个捕获组匹配的内容:
(\d*)((\d[a-z]*)-\d*)(\3)([a-z])?
合并捕获组后的输出:
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[a-z]*)-\d*)(\3)([a-z])?/;
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>
答案 1 :(得分:1)
我认为你所说的“后面跟着相同的数字”就是在破折号之前的那一段重复作为你的第三个捕获组。我建议通过拆分你的第二个捕获组然后使用反向引用来实现这个:
([\d]*)([\d][a-z]*)-([\d]*)(\2)(.?)
对于你的三个例子:
1921-1220104081741b
192123212a-1220234104081742ab
1926h-1220104081746h
这导致:
(192) (1) - (122010408174) (1) (b)
(19212321) (2a) - (122023410408174) (2a) (b)
(192) (6h) - (122010408174) (6h) ()
...您可以将两个中间组重新加入,以获得您想要的带连字符的术语。