Java 提取数据并使用正则表达式格式化
我有三根绳子要粘在一起 我有一个输入字符串(字符串1),我必须在(字符串2)上运行一个正则表达式(有组),并提取这些组,使用反向引用将它们放在模板(字符串3)中 一个简单的例子是: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的方法。显然,
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,我做了一些更改。让我知道您的想法。实际上,正如我所说的,我只知道输出模板在运行时,我编辑了我的问题,给出了我想要的基本实现。