正则表达式匹配难度

时间:2015-12-15 17:49:37

标签: regex excel vba excel-vba

我当前的正则表达式:

([\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中这样做,如果还有其他方法可以更容易地做到这一点。

2 个答案:

答案 0 :(得分:4)

您可以捕捉破折号字符前的字符,然后再匹配匹配的参考号。

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

(\d*)((\d[a-z]*)-\d*)(\3)([a-z])?

Example Here

enter image description here

合并捕获组后的输出:

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) ()

...您可以将两个中间组重新加入,以获得您想要的带连字符的术语。