首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式匹配困难

问正则表达式匹配困难
EN

Stack Overflow用户
提问于 2015-12-15 17:49:37
回答 2查看 102关注 0票数 7

我目前的判断力:

代码语言:javascript
复制
([\d]*)([^\d]*[\d][a-z]*-[\d]*)([\d][a-z?])(.?)

对,所以我试图让regex匹配一个字符串:一个计数,可以是从0到1百万的任意数量的数字,然后跟着一个数字,有时是一个字母,然后是任何数字,后面跟着相同的数字,有时是字母,有时是字母。它应该匹配的字符串示例:

代码语言:javascript
复制
1921-1220104081741b
192123212a-1220234104081742ab

基于上面的例子它应该返回什么(这是两个例子,它不应该同时读两行)。

代码语言:javascript
复制
(192) (1-122010408174) (1) (b)
(19212321) (2a-122023410408174) (2a) (b)

我的当前正则表达式适用于第二个正则表达式,但当我希望它返回(1) (b)时,它在第一个正则表达式中返回(1b),但在第二个正则表达式中返回(2a),或者返回(2a):

代码语言:javascript
复制
1926h-1220104081746h  Should Return: (192) (6h-122010408174) (6h)

不是百分之百确定如果可能,感觉我是相当新的regex。作为参考,我正在excel中做这件事,如果有其他更简单的方法的话。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-15 18:02:59

您可以在破折号字符之前捕获字符,然后返回匹配的引用。

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

代码语言:javascript
复制
(\d*)((\d[a-z]*)-\d*)(\3)([a-z])?

Example Here

​

​

合并捕获组后的输出:

代码语言:javascript
复制
1921-1220104081741b
(192) (1-122010408174) (1) (b)
代码语言:javascript
复制
192123212a-1220234104081742ab
(19212321) (2a-122023410408174) (2a) (b)
代码语言:javascript
复制
1926h-1220104081746h
(192) (6h-122010408174) (6h)

示例:

别管JS了。以下是合并捕获组后的输出:

​

代码语言:javascript
复制
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('---');
});
代码语言:javascript
复制
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

​

票数 4
EN

Stack Overflow用户

发布于 2015-12-15 18:36:58

我想你所说的“后面跟着同样的数字”的意思是,在短跑之前的那一段被重复,作为你的第三个捕获组。我建议通过拆分第二个捕获组,然后使用反向引用来实现这一点:

代码语言:javascript
复制
([\d]*)([\d][a-z]*)-([\d]*)(\2)(.?)

关于你的三个例子:

代码语言:javascript
复制
1921-1220104081741b
192123212a-1220234104081742ab
1926h-1220104081746h

这导致:

代码语言:javascript
复制
(192)      (1)  - (122010408174)    (1)  (b)
(19212321) (2a) - (122023410408174) (2a) (b)
(192)      (6h) - (122010408174)    (6h) ()

...and你可以加入两个中间组一起得到你想要的连字符术语。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34296076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档