如何使用RegEx格式化和替换组(或者可能不是?)(Java)

时间:2018-06-18 23:39:50

标签: java regex grouping backreference

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 = Pauloage = 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}

1 个答案:

答案 0 :(得分:0)

正如codisfy所提到的,如果您正在谈论javajavascript,并不清楚,当您使用replaceAll方法时,我会考虑您使用java然而,我将在下面解释的内容对大多数(如果不是全部)正则表达式引擎都是独立的,对编程语言有效。

当您致电outputString=inputString.replaceAll("REGEX","REPLACEMENT");时,方法replaceAll将配置其内部正则表达式引擎,构建有限自动机(为简单起见,我们省略DFA / NFA之间的差异)将正则表达式作为参数传递并分析调用它的inputString以进行替换并返回结果(outputString)。

当调用该方法时,它还需要替换StringREPLACEMENT),这是一个普通字符串,可能包含或不包含反向引用到某些组,为了启用一些上下文替换(使用语法$1$2\1\2,...取决于语言)。

要理解的是,正则表达式及其替换字符串都只是简单的字符串,在正则表达式引擎之外没有特殊含义(方法replaceAll)。

因此,如果您在其他方法中重用它们(例如通过将它们作为参数传递),它们将被解释为literally,就像其他普通字符串一样。

期望<{1}}取代$1nameage它只是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