从末尾解析文本(使用正则表达式)

时间:2009-01-20 14:56:08

标签: java regex

我有一个看似简单的问题,虽然我无法理解它。

假设我有以下字符串:'abcabcabcabc',我想得到'ab'的最后一次出现。有没有办法可以做到这一点没有从字符串的开头循环遍历所有其他'ab'?

我读到了锚定字符串结尾然后使用所需的正则表达式解析字符串。我不确定如何在Java中执行此操作(是否支持?)。

更新:我想我已经对我的(简化)简化示例造成了很多困惑。让我尝试另一个。比如,我有一个字符串 - '12 / 08/2008 some_text 21/10/2008 some_more_text 15/12/2008 and_finally_some_more'。在这里,我想要最后日期,因此我需要使用正则表达式。我希望这是一个更好的例子。

谢谢, Anirudh

5 个答案:

答案 0 :(得分:2)

这将为您提供匹配对象的第1组中的最后一个日期。

.*(\d{2}/\d{2}/\d{4})

答案 1 :(得分:2)

首先,感谢所有答案。

这是我尝试过的,这对我有用:

Pattern pattern = Pattern.compile("(ab)(?!.*ab)");
Matcher matcher = pattern.matcher("abcabcabcd");
if(matcher.find()) {
  System.out.println(matcher.start() + ", " + matcher.end());
}

显示以下内容:

6, 8

所以,要概括 - <reg_ex>(?!.*<reg_ex>)应该解决这个问题'?!'表示在'?!'之前的字符串后面不应出现后面的字符串。

更新: This page提供了有关使用正则表达式“未遵循”的更多信息。

答案 2 :(得分:0)

Pattern p = Pattern.compile("ab.*?$");
Matcher m = p.matcher("abcabcabcabc");
boolean b = m.matches();

答案 3 :(得分:0)

我不明白你想做什么。为什么只有最后一个如果它们都一样?为什么正则表达式为什么不是int pos = s.lastIndexOf(String str)?

答案 4 :(得分:0)

对于日期示例,您可以使用Pattern API执行此操作,而不是使用正则表达式本身。基本的想法是获得所有的匹配,然后返回最后一个。

public static void main(String[] args) {

    // this may be over-kill, you can replace with a much simpler but more lenient version
    final String dateRegex = "\\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\\b";
    final String sample = "12/08/2008 some_text 21/10/2008 some_more_text 15/12/2008 and_finally_some_more";

    List<String> allMatches = getAllMatches(dateRegex, sample);
    System.out.println(allMatches.get(allMatches.size() - 1));        
}

private static List<String> getAllMatches(final String regex, final String input) {

    final Matcher matcher = Pattern.compile(regex).matcher(input);
    return new ArrayList<String>() {{
        while (matcher.find())
            add(input.substring(matcher.start(), matcher.end()));
    }};
}