【问题标题】:Java Regex pattern, surrounded by multiple stringsJava 正则表达式模式,被多个字符串包围
【发布时间】:2013-08-05 14:20:23
【问题描述】:

这是我之前提出的问题的延续。我需要提取一个日期模式,它被字符串 String1、String2、String3 String4 包围。我所做的是

Pattern pattern = Pattern.compile("(?<=String1\sString2\s(?:0?[1-9]|[12][0-9]|3[01])([- /.])(?:0?[1-9]|1[012])\\1(?:19|20)?\\d\\d?=\sString3\sString4)");

我的日期模式是

(0?[1-9]|[12][0-9]|3[01])([- /.])(0?[1-9]|1[012])\\2(19|20)\\d\\d

效果很好,但是当尝试用字符串包围它时,我遇到了麻烦。

日期在 String2 和 String3 之间。我很确定有什么问题,因为我的程序有一个错误说无效的转义序列,但我无法弄清楚。任何帮助表示赞赏。提前致谢。

【问题讨论】:

    标签: java regex


    【解决方案1】:

    这里你有一个无效的转义序列:

    "...(?<=String1\sString..."
                   ^^
    

    您必须转义 java 字符串中的反斜杠文字才能将其传递到正则表达式模式:

    "...(?<=String1\\sString..."
                   ^^^
    

    \\d 用于数字,但\\s 用于空格,您已经正确了。

    【讨论】:

    • 这是唯一的缺陷吗?好的,现在就试试。
    • +1 \s 不是有效的 java 转义序列。您正在编写 java 字符串文字,因此您需要双反斜杠 \\scode regex \s
    • 好的,我更正了,但它似乎仍然不起作用。程序运行时产生错误。有人可以告诉我如何提取日期模式以及字符串。字符串是特定的,因此不需要模式。
    • @newtoprogramming:发布确切的错误消息。另外,不要只描述输入,还要显示一些真实的输入和预期的输出,我们可以更好地帮助您。您可以随时使用问题下方的edit 按钮。
    • @jlordo 预期的输出应该是 String1 String2 7/2/2013 String3 String4,需要提取并复制到一个数组列表中。正则表达式,必须与输入字符串匹配,该字符串包含超过 100 个单词以及模式行。
    【解决方案2】:

    您的正则表达式以:

    结尾
    \\d?=\sString3\sString4)
    

    您似乎错过了一个左方括号以使其积极向前预测,当然\s 应该是\\s。将该部分更改为:

    \\d(?=\\sString3\\sString4)
    

    【讨论】:

    • 是的,我已经改变了。但是我不理解。我应该将整个正则表达式括在方括号中吗?
    • @newtoprogramming:你为什么要这么做?您现在应该花时间了解您的模式是如何工作的。
    • 没有方括号用于字符类。如果您清楚地解释您的问题,我们可以尽力帮助您。
    • @anubhava 这是我正在尝试编写正则表达式“评论于 2013 年 7 月 2 日(版本 1.0)”的确切行,我尝试“评论于 (?:0 ?[1-9]|[12][0-9]|3[01])([- /.])(?:0?[1-9]|1[012])\\1(?: 19|20)?\\d\\d (version 1.0)" 以及 "(?
    • 能否在您的问题中提供此代码,因为很难从评论中阅读。
    【解决方案3】:

    我知道很多人不知道精彩课堂MessageFormat的特点,所以在这里快速提醒一下:

    MessageFormat format = new MessageFormat("String1 String2 {0,date} String3 String4");
    try {
        Object[] parse = format.parse("String1 String2 31.8.2000 String3 String4");
        Date date = (Date) parse[0];
        System.out.println(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多