output = output.replaceAll("%(\\w+)%",getVar("$1"));
public String getVar(name){...return formatted;}
我有这行代码(在JAVA中),以及一个名为getVar()
的函数,它将为我提供具有我们想要名称的变量的值。该函数运行正常,但此代码似乎不再寻找组。
我使用此正则表达式格式化的字符串是:
"My name is %name% and I am %age% years old."
而不是让我回复:"My name is Paulo and I am 15 years old."
(因为name = Paulo
和age = 15
)它没有给我任何回报。它不是用getVar(name)
或getVar(age)
替换正则表达式,而是将其替换为getVar("$1")
。
有没有办法修复它,这是一个错误,还是预期的行为?如果是,我怎么能以另一种方式获得相同的结果呢?
编辑:
for(String i: varnames){
output = output.replaceAll("%"+i+"%",getVar(i));
}
这个具体案例的工作是否......但是,有没有办法在replaceAll()
内使用函数并维护组(例如$1
,$2
)在里面工作功能?
编辑2:
//Variables//
ArrayList<String> varnames = new ArrayList<String>(0);
ArrayList<String> varvalues = new ArrayList<String>(0);
//end of Variables
private String getVar(String name){
String returnv = "";
if(varnames.contains(name.toLowerCase())) returnv = varvalues.get(varnames.indexOf(name.toLowerCase()));
//System.out.println("\n\n"+name+"\n\n");
return returnv;
}
private String format(String input){
String output = input;
output = output.replace("[br]","/n");
for(String i: varnames){
output = output.replaceAll("%"+i+"%",getVar(i));//This is how I am parsing the variables.
}
//Here I want to handle inline functions... for example: a function called 'invert' that would switch the letters. If the input String that is being formatted (output) contains the regex, the function needs to evaluate and replace.
//How I tried to do it:
output.replaceAll("invert\((\w+)\)",invertLetters("$1"));
return output;
}
public String invertLetters(String input){//Inverts the letters of the String}
答案 0 :(得分:0)
正如codisfy所提到的,如果您正在谈论java
或javascript
,并不清楚,当您使用replaceAll
方法时,我会考虑您使用java
。 然而,我将在下面解释的内容对大多数(如果不是全部)正则表达式引擎都是独立的,对编程语言有效。
当您致电outputString=inputString.replaceAll("REGEX","REPLACEMENT");
时,方法replaceAll
将配置其内部正则表达式引擎,构建有限自动机(为简单起见,我们省略DFA
/ NFA
之间的差异)将正则表达式作为参数传递并分析调用它的inputString
以进行替换并返回结果(outputString
)。
当调用该方法时,它还需要替换String
(REPLACEMENT
),这是一个普通字符串,可能包含或不包含反向引用到某些组,为了启用一些上下文替换(使用语法$1
,$2
或\1
,\2
,...取决于语言)。
要理解的是,正则表达式及其替换字符串都只是简单的字符串,在正则表达式引擎之外没有特殊含义(方法replaceAll
)。
因此,如果您在其他方法中重用它们(例如通过将它们作为参数传递),它们将被解释为literally
,就像其他普通字符串一样。
期望<{1}}取代$1
或name
。age
它只是getVar("$1")
而没有别的。
另外,这就是说,你的方法$1
甚至没有返回一个字符串,因为它的返回类型是public void getVar(name){...}
,因此,如果你在void
中编码并且你使用{ {1}} String类的方法(需要2个字符串作为参数),它首先甚至不编译。
我会让你实现剩下的代码,但如果你以下面的方式更改你的替换循环它应该工作:
java
replaceAll
方法代码:(我会让你改编它)
String input="My name is %name% and I am %age% years old.";
Matcher matcher = Pattern.compile("%(\\w+)%").matcher(input);
String output=new String(input);
while (matcher.find()) {
System.out.println("------------------------------------");
System.out.println("Back reference:" + matcher.group(1));
String group=matcher.group(1);//give access to the first matching group so that it can be reused
output=output.replaceAll("%"+group+"%", getVar(group));
}
System.out.println(output);
<强>输出:强>
getVar