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

问题描述:

我有一个字符串模板包含需要被替换的$变量。如何使用正则表达式替换java中的标记?

字符串模板:“嗨,我的名字是$名\ NI上午$古老我$性。”

,我试过验证在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()); 


    } 

} 
+0

这应该可以正常工作。你已经适当地逃脱了$(\\),所以它不会匹配行尾。错误是什么? – Drgabble

您正在使用matcher.group(1),但你没有定义的正则表达式(())任何一组,所以你可以只使用group()整个匹配的字符串,这是你想要的。

更换行:

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

有了:

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

通知之子,你的地图只包含单词,但匹配也将匹配$,所以你需要在地图中搜索“$年龄“.substring(1)”,但总体上做替换$age

+0

不完全正确 - 他不希望整个字符串,只是美元 – Drgabble

+0

后的单词确定,但他需要替换字符串中的文本,所以他实际上需要'$ age'和'age'。他可以通过添加或删除'$'来获得这两者之一。 –

+0

我使用静态Pattern Pattern = Pattern.compile(“\\ $ \\ w +”);但它仍然不适合我。 – dataEnthusiast

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

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()); 

您可以尝试更换模式字符串

\\$(\\w+)

和变量替换工作。您目前的模式只有组0(整个模式),但不包含组1。添加圆括号使第一组成为变量名称,替换将替换美元符号和变量名称。

你没有把正确的东西当作你的钥匙。更改为组(),并将地图更改为'$ name'等:

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()); 


    } 

} 
+0

添加括号不起作用。 – dataEnthusiast