我正在创建一个程序,允许用户设置变量,然后在%variable1%
等消息中使用它们,我需要一种方法来检测指示变量(%STRING%)
的模式。我知道我可以使用正则表达式来查找模式但不确定如何使用它来替换文本。
我还可以看到在单个字符串中使用多个变量时出现的问题,因为它可能会检测到2个变量之间的空间作为第三个变量
例如%var1%
< -text可能被检测为variable->%var2%
,会发生这种情况并且有什么方法可以阻止它吗?
感谢。
答案 0 :(得分:2)
非贪婪的正则表达式有助于提取2个不同的%符号内的变量:
Pattern regex = Pattern.compile("\\%.*?\\%");
在这种情况下,如果您的字符串是%variable1%mndhokajg%variable2%"
,则应该打印
%variable1%
%variable2%
如果您的字符串是%variable1%variable2%
,则应该打印
%variable1%
%variable1%%variable2%
应打印
%variable1%
%variable2%
您现在可以为您的目的操纵/使用提取的变量:
<强>代码:强>
public static void main(String[] args) {
try {
String tag = "%variable1%%variable2%";
Pattern regex = Pattern.compile("\\%.*?\\%");
Matcher regexMatcher = regex.matcher(tag);
while (regexMatcher.find()) {
System.out.println(regexMatcher.group());
}
} catch (Exception e) {
e.printStackTrace();
}
}
尝试使用不同的字符串,可能会出现无效的情况,%作为字符串的一部分,但您的要求似乎并不那么严格。
答案 1 :(得分:1)
Oracle's tutorial应该可以帮助您入门。以下是您可能感兴趣的教程中的示例:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceDemo {
private static String REGEX = "dog";
private static String INPUT =
"The dog says meow. All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
如果正确使用正则表达式,则不应发生第二个问题。
答案 2 :(得分:1)
您可以使用此方法进行变量检测,并将其替换为传递的HashMap
:
// regex to detect variables
private final Pattern varRE = Pattern.compile("%([^%]+)%");
public String varReplace(String input, Map<String, String> dictionary) {
Matcher matcher = varRE.matcher( input );
// StringBuffer to hold replaced input
StringBuffer buf = new StringBuffer();
while (matcher.find()) {
// get variable's value from dictionary
String value = dictionary.get(matcher.get(1));
// if found replace the variable's value in input string
if (value != null)
matcher.appendReplacement(buf, value);
}
matcher.appendTail(buf);
return buf.toString();
}