Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 提取数据并使用正则表达式格式化_Java_Android_Regex - Fatal编程技术网

Java 提取数据并使用正则表达式格式化

Java 提取数据并使用正则表达式格式化,java,android,regex,Java,Android,Regex,我有三根绳子要粘在一起 我有一个输入字符串(字符串1),我必须在(字符串2)上运行一个正则表达式(有组),并提取这些组,使用反向引用将它们放在模板(字符串3)中 一个简单的例子是: input: "foo1234bar5678" regex: ".*?(\\d*).*?(\\d*).*" template: "answer: $1 $2" 应在“答复:1234 5678”中对其进行扩展 我一直在使用java.util.regex.Pattern,但我想不出一种使用matchers的方法。显然,

我有三根绳子要粘在一起

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

一个简单的例子是:

input: "foo1234bar5678"
regex: ".*?(\\d*).*?(\\d*).*"
template: "answer: $1 $2"
应在“答复:1234 5678”中对其进行扩展

我一直在使用java.util.regex.Pattern,但我想不出一种使用matchers的方法。显然,replaceAll和append*都不是预期的行为

有没有一种方法可以很好地使用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;
}
publicstaticstringgenoutput(字符串正则表达式、字符串输入、字符串模板){
Pattern p=Pattern.compile(regex);
匹配器m=p.Matcher(输入);
if(m.find()){

对于(int i=1;i,下面是我将如何做的:

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");
}
Pattern p=Pattern.compile((?:\\D*(\\D*)\\D*)+);
匹配器m=p.Matcher(输入);
if(m.find()){
String result=“答案:”;
对于(int i=1;i
这将匹配您的字符串,然后使用这两个组作为
string
格式化程序的输入

.*(\d*).*(\d*).*
你的问题是你的正则表达式包含了转发器,但是没有字符可以重复


上面的正则表达式将执行您想要的操作。

以下修改也将帮助您:

.*?(\d*).*?(\d*).*
问号表示正则表达式应该匹配最小数量的字符。否则它匹配最大数量的字符,因此
*
匹配整个字符串


显然,不要忘记,在使用Java时,反斜杠必须重复:一个反斜杠用于Java,另一个反斜杠用于正则表达式,即
Pattern.compile(“.*”(\\d*)。(\\d*)。);

在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());
    }
}
private void appends(StringBuffer,strings){
布尔转义=假;
布尔美元=假;
对于(int i=0;i}否则如果(c>='0'&&c实际上,regex中的组数在运行时是未定义和加载的,要使用的模板也是如此。我可以在for语句中从1迭代到10,然后尝试替换,但这不是非常有效的imho。@mripard,我做了一些更改。让我知道您的想法。实际上,正如我所说的,我只知道输出模板在运行时,我编辑了我的问题,给出了我想要的基本实现。