我有三个字符串,我必须粘在一起。
我有一个输入字符串(字符串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;
}
答案 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());
}
}