我有一个包含$ 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());
}
}
答案 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());
}
}