使用正则表达式

时间:2017-05-03 08:47:58

标签: java regex

我有多种类型的字符串,如:

ProjectOne
ProjectOne-2017-05-03
ProjectOne_version2
ProjectOne-2017-04-24
ProjectOne-2017-04-10_Version2
ProjectTwo
ProjectTwo-2016-11-12
...

我想找到一种使用正则表达式(或最简单)来提取项目名称和项目日期的方法。我的目标是为每个项目保留最近的版本(基于其日期,只有名称或名称和版本的版本被认为比具有日期的版本更旧)

有没有办法使用正则表达式提取这些不同的子串?我读了一下它,这很令人困惑。

2 个答案:

答案 0 :(得分:1)

输入数据没有遵循任何/很多规​​则的问题:确定其内容

换句话说:首先必须退后一步,查看所有数据;为了发现"模式"在数据集中。然后,您会想到可用于将条目放入不同存储桶的规则

示例:

  

ProjectOne-2017年4月24日

似乎有些条目遵循以下规则:

name separator iso-date

这意味着:简单的首先检查是确定传入的字符串是否与

匹配
(\w+)[-_](\d{4}[-_]\d{2}[-_]\d{2})

此正则表达式匹配:

  • 一系列(超过1个)非空白字符
  • 后跟4位数字,2位数字,2位数字;用_或 - 作为它们之间的分隔符
  • 正则表达式包含两组;所以如果你有匹配,第一组将包含你的项目名称;第二组是ISO日期值(作为字符串)。

上述内容仅仅意味着"灵感&#34 ;;最后,它是你的项目;所以必须坐下来学习和理解正则表达式。您可以here开始了解此类模式的规则。或here获取有关该主题的完整教程。

长话短说:没有弯路 - 不要期望SO为你提供一个解决你所有问题的魔法正则表达式;特别是考虑到你对你打算使用的概念缺乏必要的理解。

答案 1 :(得分:1)

您有很多情况,因此您可以使用群组,例如:

  1. (project\\w+)[-_]匹配项目名称
  2. ([0-9]{4}-[0-9]{2}-[0-9]{2})以匹配日期
  3. version\\d+以匹配项目的版本
  4. 所以你的代码应该是这样的:

    public static void main(String[] args) {
        String projects[] = {"ProjectOne-2017-05-03", "ProjectOne_version2",
            "ProjectOne-2017-04-24", "ProjectTwo-2016-11-12",
            "ProjectOne-2017-04-10_Version2"};
        for (String project : projects) {
            System.out.println("Input : " + project);
            Pattern pattern = Pattern.compile("(?i)(project\\w+)[-_]|([0-9]{4}-[0-9]{2}-[0-9]{2})|(version\\d+)");
            Matcher matcher = pattern.matcher(project);
    
            while (matcher.find()) {
                if (matcher.group(1) != null) {
                    System.out.println(matcher.group(1));
                }
                if (matcher.group(2) != null) {
                    System.out.println(matcher.group(2));
                }
                if (matcher.group(3) != null) {
                    System.out.println(matcher.group(3));
                }
            }
            System.out.println("******************************************");
        }
    }
    

    <强>输出

    Input : ProjectOne-2017-05-03
    ProjectOne
    2017-05-03
    ******************************************
    Input : ProjectOne_version2
    ProjectOne
    version2
    ******************************************
    Input : ProjectOne-2017-04-24
    ProjectOne
    2017-04-24
    ******************************************
    Input : ProjectTwo-2016-11-12
    ProjectTwo
    2016-11-12
    ******************************************
    Input : ProjectOne-2017-04-10_Version2
    ProjectOne
    2017-04-10
    Version2
    ******************************************
    

    Regex demo