如何使用正则表达式替换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());
}
}
您正在使用matcher.group(1)
,但你没有定义的正则表达式((
)
)任何一组,所以你可以只使用group()
整个匹配的字符串,这是你想要的。
更换行:
String replacement = replacements.get(matcher.group(1));
有了:
String replacement = replacements.get(matcher.group().substring(1));
通知之子,你的地图只包含单词,但匹配也将匹配$
,所以你需要在地图中搜索“$年龄“.substring(1)”,但总体上做替换$age
。
不完全正确 - 他不希望整个字符串,只是美元 – Drgabble
后的单词确定,但他需要替换字符串中的文本,所以他实际上需要'$ age'和'age'。他可以通过添加或删除'$'来获得这两者之一。 –
我使用静态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());
}
}
添加括号不起作用。 – dataEnthusiast
这应该可以正常工作。你已经适当地逃脱了$(\\),所以它不会匹配行尾。错误是什么? – Drgabble