如何使用正则表达式替换java中的标记?

时间:2016-08-01 14:57:03

标签: java regex

我有一个包含$ variables的字符串模板,需要更换。

字符串模板:“我的名字是$ name。\ n我已经年纪大了。我是$ sex”

我尝试验证的解决方案在java程序中不起作用。 http://regexr.com/3dtq1

此外,我提到https://www.regex101.com/,我无法检查该模式是否适用于java。但是,在阅读其中一个教程时,我发现“$ Matches end of line”。用变量替换模板中的标记的最佳方法是什么?

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternCompiler {
    static String text = "hi my name is $name.\nI am $age old. I am $sex";
    static Map<String,String> replacements = new HashMap<String,String>();
    static Pattern pattern = Pattern.compile("\\$\\w+");
    static Matcher matcher = pattern.matcher(text);

    public static void main(String[] args) {

        replacements.put("name", "kumar");
        replacements.put("age", "26");
        replacements.put("sex", "male");

        StringBuffer buffer = new StringBuffer();

        while (matcher.find()) {
            String replacement = replacements.get(matcher.group(1));
            if (replacement != null) {
                // matcher.appendReplacement(buffer, replacement);
                // see comment 
                matcher.appendReplacement(buffer, "");
                buffer.append(replacement);
            }
        }
        matcher.appendTail(buffer);
        System.out.println(buffer.toString());


    }

}

4 个答案:

答案 0 :(得分:3)

您正在使用matcher.group(1),但未在正则表达式中定义任何组(( )),因此您只能将group()用于整个匹配的字符串,这就是你想要的。

替换行:

String replacement = replacements.get(matcher.group(1));

使用:

String replacement = replacements.get(matcher.group().substring(1));

注意子字符串,你的地图只包含单词,但匹配器也会匹配$,所以你需要在地图中搜索“$ age”.substring(1)“但是要整体替换{{ 1}}。

答案 1 :(得分:1)

您可以尝试用

替换模式字符串

def traverse(self): source = self._nodelist[0] self.sand_pile(source) return def sand_pile(self, start): for sink in start._sinks: //ALGORITHM FOR SENDING DATA HERE for s in start._sinks: self.sand_pile(s) return

并且变量替换有效。您当前的模式只有组\\$(\\w+)(整个模式),而不是组0。添加括号使第一个组成为变量名称,替换将替换美元符号和变量名称。

答案 2 :(得分:0)

您的代码只有轻微的故障。

    static Map<String,String> replacements = new HashMap<>();
    static Pattern pattern = Pattern.compile("\\$\\w+\\b"); // \b not really needed

            // As no braces (...) there is no group(1)
            String replacement = replacements.get(matcher.group());

答案 3 :(得分:0)

你没有使用正确的东西作为你的钥匙。更改为分组(),并将地图更改为&#39; $ name&#39;等:

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld {
    static String text = "hi my name is $name.\nI am $age old. I am $sex";
    static Map<String,String> replacements = new HashMap<String,String>();
    static Pattern pattern = Pattern.compile("\\$\\w+");
    static Matcher matcher = pattern.matcher(text);

    public static void main(String[] args) {

        replacements.put("$name", "kumar");
        replacements.put("$age", "26");
        replacements.put("$sex", "male");

        StringBuffer buffer = new StringBuffer();

        while (matcher.find()) {
            String replacement = replacements.get(matcher.group());
            System.out.println(replacement);
            if (replacement != null) {
                // matcher.appendReplacement(buffer, replacement);
                // see comment 
                matcher.appendReplacement(buffer, "");
                buffer.append(replacement);
            }
        }
        matcher.appendTail(buffer);
        System.out.println(buffer.toString());


    }

}