使用正则表达式从字符串中提取数据

时间:2018-12-25 13:41:42

标签: java regex

我要从字符串中提取业务价值。但是我的问题是,字符串在循环中每次都重复。并且内容语法总是相同的,但是内容正在变化。 因此,我需要一个reg-expr来帮助我提取数据。

到目前为止我尝试过的是: ("^\\d{1,2}(.{1})\\s([A-Za-z]{2})\\s(([A-Z]\\d{2,3}))\\s.")

但是上面提供的模式仅向我输出前三个参数: 01。 Di F929

示例字符串显示如下:

01. Di F929 * Fr F929 Fr FREI Mo S688 Mi S49 * Sa S57 Mo F929 
Do F224 So S49 Di X337 Fr F56 So FREI \n

让我解释一下如何构建字符串。

  1. (01。)是从01到31的数字。
  2. 紧随其后的是WeekdayDays(德语)(Mo,Di,Mi,..)
  3. 以字符开头的单词以数字结尾(F929,S49等)
  4. (可选)特殊字符,例如'*,X,...'

重要:

Di + F929 + *
代表单个数据块。每个字符串包含大约12个数据块。

我需要的是一个匹配上述问题的正则表达式。 谢谢!

1 个答案:

答案 0 :(得分:1)

这将帮助您:

(\d{1,2}\.)?\s*([A-Za-z]{2}\s+[A-Z0-9]+\s*[*X]?)\s*

Online Demo

Java代码:

public class Test {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("(\\d{1,2}\\.)?\\s*([A-Za-z]{2}\\s+[A-Z0-9]+\\s*[*X]?)\\s*");
        String string = "01. Di F929 * Fr F929 Fr FREI Mo S688 Mi S49 * Sa S57 Mo F929 " +
            "Do F224 So S49 Di X337 Fr F56 So FREI \\n";

        Matcher m = pattern.matcher(string);

        while (m.find())
            System.out.println(m.group(2));
    }
}