1

例如,以下正则表达式尝试考虑所有可能的、有效的非军事时间间隔。如:“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

与我有关JavaPerl对我最好的答案。

谢谢您的帮助!

4

2 回答 2

1

Is there any way to reference part of a regular expression??

是的。您可以使用该符号(?1)来重用第一个定义组。在您的情况下,它是:

(?<!\d|-|:)(((?:0?[1-9]|1[0-2])(?::[0-5][0-9])?)-(?2))(?!\d|-|:)

你必须再做一组。

于 2013-11-05T13:04:19.903 回答
0

可能是最短/简单的版本:

包片段;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.regex.Pattern;

import org.junit.Test;

public class RegexTest {

    @Test
    public void test() {
        Pattern p = Pattern.compile("(0?[0-9]|1[0-2])(:[0-5][0-9])?-(0?[0-9]|1[0-2])(:[0-5][0-9])?");
        assertFalse(p.matcher("0").matches());
        assertFalse(p.matcher("1:00").matches());
        assertFalse(p.matcher("9:59").matches());
        assertFalse(p.matcher("10:01").matches());
        assertFalse(p.matcher("12").matches());

        assertTrue(p.matcher("04-12:15").matches());
        assertTrue(p.matcher("12:30-9").matches());
        assertTrue(p.matcher("3:10-4:57").matches());

        assertFalse(p.matcher("9:6").matches());
        assertFalse(p.matcher("9:60").matches());
        assertFalse(p.matcher("13").matches());
        assertFalse(p.matcher("20").matches());
        assertFalse(p.matcher("20:").matches());
        assertFalse(p.matcher("20-").matches());
        assertFalse(p.matcher(":20").matches());
        assertFalse(p.matcher("-20").matches());
    }

}

对于您的问题:

(1)据我所知,你需要的不是那种方式。反向引用期望与第一次相同的值。http://www.regular-expressions.info/backref.html

(2) 据我所知没有。

于 2013-11-05T02:25:39.860 回答