例如,以下正则表达式尝试考虑所有可能的、有效的非军事时间间隔。如:“04-12:15”、“12:30-9”、“3:10-4:57”,但不匹配以下内容:
"<td class="text">2013-11-04</td>"
.
正则表达式(来自另一个类似的问题归功于 @MikeClark 的正则表达式):
regex = "(?<!\\d|-|:)((?:0?[1-9]|1[0-2])(?::[0-5][0-9])?-
(?:0?[1-9]|1[0-2])(?::[0-5][0-9])?)(?!\\d|-|:)"
这是正则表达式的解释:
(?<!\\d|-|:)
数字、连字符或冒号的负
(?:0?[1-9]|1[0-2])
前瞻 计算所有有效时间
(?::[0-5][0-9])
计算所有有效分钟
(?!\\d|-|:)
数字、连字符或冒号的负前瞻
希望其余的都是不言自明的。这有效,但它非常冗长。理论上,这可以简化为:
令 EXP =(?:0?[1-9]|1[0-2])(?:[0-5][0-9])?
"(?<!\\d|-|:)((?:0?[1-9]|1[0-2])(?::[0-5][0-9])?-EXP)(?!\\d|-|:)";
所以我的问题是:
(1) : 有没有办法引用正则表达式的一部分?反向引用不起作用,因为它不是我想要的表达式匹配的内容(假设它是一个捕获组),而是表达式本身。我知道可以将表达式存储在 String 中并使用format()
,但我想看看是否可以仅在正则表达式中执行此操作。
(2):我能想到的唯一另一件事是能够确定一个表达式中的重复项。如:
鉴于:regex = "...(?:someExpression){2}"
有没有办法确定我们是在第一次还是第二次重复someExpression
?
与我有关Java
或Perl
对我最好的答案。
谢谢您的帮助!