正则表达式:考虑指定区域之外的字符

时间:2014-04-12 15:17:27

标签: regex

正则表达式:

Nov/([0-3][0-9])

试验:

  1. Wed Nov/21/2012 - ... ===> Nov/21确定
  2. Wed 21/Nov/2012 - ... ===> Nov/20 BAD
  3. 有没有办法忽略regex的第二种情况?

    (我能想到的唯一方法是在当前正则表达式之前添加一个空格,但感觉就像是一个黑客,我想知道是否有正确的方法)

    我正在使用Java(java.util.regex包)。

3 个答案:

答案 0 :(得分:2)

您可以使用negative lookahead过滤掉第二种情况:

Nov/([0-3][0-9])(?![0-9]{2})

这是a fiddle where you can check it out

请注意,对于java.util.regex的{​​{3}}课程,在这种情况下,您需要使用Matcher而不是find()。你会在小提琴中注意到这一点,而matches()很好地解释了为什么。

答案 1 :(得分:1)

否定前瞻在这里是过度的。我总是喜欢在可能的情况下坚持使用香草正则表达式功能,以便其他人更容易理解和更便携。您正在捕获组([0-9][0-9])中已有的月份中的某一天。如果提取这是你的目的,我认为没有理由不让你的整个正则表达式更明确地围绕当月的那一天。如果我在命令行上编写正则表达式(例如sedperl),那么你添加一个前导空格(或者等效地是一个尾部斜杠)的本能就是我要做的事情。 。通过拼写出年份来表达您正在搜索的整个日期部分:Nov/([0-3][0-9])/[0-9][0-9][0-9][0-9]。额外的字符不会影响您使用捕获日期的方式。

答案 2 :(得分:0)

您想在11月份检查有效日期吗?

试试这个。

                            //Nov/two digits/four digits
Pattern p = Pattern.compile("(Nov/\\d{2}/\\d{4})");
//Try this one if you want to validate date also
//Pattern p = Pattern.compile("(Nov/(0?[1-9]|[12][0-9]|30)/((19|20)\\d\\d))$");
String[] values = new String[] { "Wed Nov/21/2012", "Wed 21/Nov/2012" };
for (String value : values) {
    Matcher m = p.matcher(value);
    if (m.find()) {
        System.out.println(value + " found");
    } else {
        System.out.println(value + " not found");
    }
}

输出:

Wed Nov/21/2012 found
Wed 21/Nov/1012 not found

如需了解更多信息,请查看samples here