【问题标题】:Parsing text from the end (using regular expressions)从末尾解析文本(使用正则表达式)
【发布时间】:2009-01-20 14:56:07
【问题描述】:

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

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

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

更新:我想我的(过度)简化示例引起了很多混乱。让我试试另一个。说,我有一个这样的字符串 - '12/08/2008 some_text 21/10/2008 some_more_text 15/12/2008 and_finally_some_more'。在这里,我想要 last date,因此我需要使用正则表达式。我希望这是一个更好的例子。

谢谢, 阿尼鲁德

【问题讨论】:

    标签: java regex


    【解决方案1】:

    首先,谢谢大家的回答。

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

    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】:

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

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

      【讨论】:

      • 不错且简单的解决方案。将其更改为他的新条件:.*(\d{2}/\d{2}/\d{4})
      【解决方案3】:
      Pattern p = Pattern.compile("ab.*?$");
      Matcher m = p.matcher("abcabcabcabc");
      boolean b = m.matches();
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 也许是因为 ab 只是一个例子?您正在寻找的可能是 [abc][abc]。然后 lastIndexOf() 出来了。当然,如果它真的是一个简单的字符串,那么确实 lastIndexOf() 就是答案。
        【解决方案5】:

        对于日期示例,您可以使用 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()));
            }};
        }
        

        【讨论】:

        • 是的,这也有效。但是,我一直在寻找可以让我得到答案的东西,而无需遍历所有匹配项。
        猜你喜欢
        • 1970-01-01
        • 2016-04-27
        • 2015-10-10
        • 1970-01-01
        • 2012-05-18
        • 2013-08-13
        相关资源
        最近更新 更多