使用RegEx提取数据并对其进行格式化

时间:2010-11-17 17:39:05

标签: java android regex

我有三个字符串,我必须粘在一起。

我有一个输入字符串(字符串1),我必须在(字符串2)上运行正则表达式(具有组)并提取这些组以使用反向引用将它们放入模板(字符串3)。

一个简短的例子可能是:

input: "foo1234bar5678"
regex: ".*?(\\d*).*?(\\d*).*"
template: "answer: $1 $2"

应在“回答:1234 5678”中进行扩展。

我一直在使用java.util.regex.Pattern,但我找不到用匹配器做这个的方法。显然,replaceAll不是预期的行为,也不是追加*。

有没有办法很好地使用android API?

编辑: 这是一个基本的实现:

public static String genOutput(String regex, String input, String template) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    if (m.find()) {
         for (int i = 1; i <= m.groupCount(); i++) {
             template = template.replaceAll("\\$" + i, m.group(i));
         }
    }
        return template;
}

4 个答案:

答案 0 :(得分:2)

我将如何做到这一点:

Pattern p = Pattern.compile("(?:\\D*(\\d*)\\D*)+");
Matcher m = p.matcher(input);
if (m.find()) {
    String result = "answer: ";
    for (int i = 1; i < m.groupCount(); i++) {
        result += m.group(i) + " ";
    }
    System.out.println(result);
} else {
    System.out.println("Input did not match");
}

这将匹配您的字符串,然后使用这两个组作为String格式化程序的输入。

答案 1 :(得分:0)

.*(\d*).*(\d*).*

你的问题是你的正则表达式包含中继器,但没有重复的字符......

上面的正则表达式会做你想要的。

答案 2 :(得分:0)

以下修改也会对您有所帮助:

.*?(\d*).*?(\d*).*

问号表示正则表达式应匹配最少数量的字符。否则它匹配最大值,因此.*匹配整个字符串。

显然不要忘记,当您使用Java时,反斜杠必须重复:Java的一个反斜杠,正则表达式的下一个斜杠,即Pattern.compile(".*?(\\d*).*?(\\d*).*");

答案 3 :(得分:0)

挖掘android的libcore,我在java.util.Matcher中找到了一个私有方法appendEvaluated,它完成了这项工作。所以我在我的代码中复制/粘贴了它。

这是:

private void appendEvaluated(StringBuffer buffer, String s) {
    boolean escape = false;
    boolean dollar = false;

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == '\\' && !escape) {
            escape = true;
        } else if (c == '$' && !escape) {
            dollar = true;
        } else if (c >= '0' && c <= '9' && dollar) {
            buffer.append(group(c - '0'));
            dollar = false;
        } else {
            buffer.append(c);
            dollar = false;
            escape = false;
        }
    }

    // This seemingly stupid piece of code reproduces a JDK bug.
    if (escape) {
        throw new ArrayIndexOutOfBoundsException(s.length());
    }
}