Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示超过3周的正则表达式匹配项_Java_Regex_Cisco - Fatal编程技术网

Java 显示超过3周的正则表达式匹配项

Java 显示超过3周的正则表达式匹配项,java,regex,cisco,Java,Regex,Cisco,我得到一个关于设备正常运行时间的字符串,如下所示: swLUZ01 uptime is 1 year, 11 weeks, 1 day, 11 hours, 9 minutes swLUZ01 uptime is 4 weeks, 5 days, 14 hours, 2 minutes swLUZ01 uptime is 1 week, 2 days, 9 hours, 55 minutes swLUZ01 uptime is 1 hour, 16 minutes 我构建了一个与前两个条目相

我得到一个关于设备正常运行时间的字符串,如下所示:

swLUZ01 uptime is 1 year, 11 weeks, 1 day, 11 hours, 9 minutes
swLUZ01 uptime is 4 weeks, 5 days, 14 hours, 2 minutes
swLUZ01 uptime is 1 week, 2 days, 9 hours, 55 minutes
swLUZ01 uptime is 1 hour, 16 minutes
我构建了一个与前两个条目相匹配的正则表达式,并将它们放在一个组中:

(\D+\d+) uptime is (\d+ \w+\, \d+ \w+)
到目前为止,这是可行的。现在,我只想捕获运行时间超过3周的设备。在本例中,它使用以下正则表达式:

(\D+\d+) uptime is (\d+ \w+\, ([3-9]|\d{2}) weeks)
(\D+\d+) uptime is ((\d+ years?\,\s)\d+ \w+)|(([3-9]|\d{2}) weeks\,\s\d+ \w+)
但这只有在每一年和每一周的顺序都相同的情况下才有效。遗憾的是,设备的正常运行时间可能如下所示:

swLUZ01 uptime is 1 year, 11 weeks, 1 day, 11 hours, 9 minutes
swLUZ01 uptime is 4 weeks, 5 days, 14 hours, 2 minutes
swLUZ01 uptime is 1 week, 2 days, 9 hours, 55 minutes
swLUZ01 uptime is 1 hour, 16 minutes

因此,如果是单数,发音每周都在变化。如果超过x周,是否有一个正则表达式可以给我匹配?如果根本找不到星期,它就不应该给出一个匹配。我需要一个组中的结果,因为我稍后会在规则手册中引用它。(Prime Infrastructure Compliance Audit Policys)

我通过以下正则表达式成功地完成了这项工作:

(\D+\d+) uptime is (\d+ \w+\, ([3-9]|\d{2}) weeks)
(\D+\d+) uptime is ((\d+ years?\,\s)\d+ \w+)|(([3-9]|\d{2}) weeks\,\s\d+ \w+)
在以下示例中,这将以捕获(粗体)形式返回2个值:

swLUZ01 uptime is 11 weeks, 1 day, 11 hours, 9 minutes
swLUZ01 uptime is 2 weeks, 1 day, 11 hours, 9 minutes
swLUZ01 uptime is 5 days, 11 hours, 9 minutes
回馈:11周,1天

swLUZ01 uptime is 1 year, 1 week, 1 day, 11 hours, 9 minutes
回馈:1年1周

swLUZ01 uptime is 2 years, 11 weeks, 1 day, 11 hours, 9 minutes
回馈:2年11周

它与以下示例不匹配:

swLUZ01 uptime is 11 weeks, 1 day, 11 hours, 9 minutes
swLUZ01 uptime is 2 weeks, 1 day, 11 hours, 9 minutes
swLUZ01 uptime is 5 days, 11 hours, 9 minutes

你想要这样的东西吗?它正确地完成了匹配的部分,但是没有我以后可以使用的捕获组…你想要捕获哪个部分以及何时使用?
swLUZ01正常运行时间是4周、5天、14小时、2分钟
应该会在捕获组中返回
4周、5天
swLUZ01正常运行时间是1年11周1天11小时9分钟
应该在捕获组中返回
1年11周
。这有很多条款,必须捕获:-1年2周-3周2天-3周20分钟,所以我建议不要使用复杂的正则表达式,提取这些值,然后将其与捕获组进行比较,使正常运行时间始终在同一组中匹配2
(\D+\D+)正常运行时间为(\D+年?\,\s\D+\w+[3-9]\D{2}周\,\s\D+\w+)
必须将OR语句放在括号中,但使用了非捕获组,因为我不需要此匹配的内容:
(\w+)正常运行时间为(\d+年?\,\s\d+\w+|(?:[3-9]|\d{2})周\,\s\d+\w+)
我认为,如果在捕获的周数上使用逻辑,而不是在正则表达式中嵌入识别大于2的数字的方法,则正则表达式将更易于阅读/维护。