看來你需要找到的都 I型和II型模式的出現,所以你應該做的在一次掃描中。
,可以這樣進行:
String input = "adklsfjb$${xxx}dklsjfnsdklj${yyy}";
Pattern p = Pattern.compile("(\\$)?\\$\\{([^}]+)}");
for (Matcher m = p.matcher(input); m.find();) {
if (m.start(1) == -1) {
System.out.println("Found Type I match for variable '" + m.group(2) + "'" +
" at index " + m.start() + "-" + m.end());
} else {
System.out.println("Found Type II match for variable '" + m.group(2) + "'" +
" at index " + m.start() + "-" + m.end());
}
}
輸出
Found Type II match for variable 'xxx' at index 8-15
Found Type I match for variable 'yyy' at index 27-33
UPDATE
如果你想和值替換的模式,你可以使用appendReplacement()
和appendTail()
。
例子:
String input = "adklsfjb$${xxx}dklsjfnsdklj${yyy}adljfhjh";
Map<String, String> type1 = new HashMap<>();
type1.put("xxx", "[type I with x's]");
type1.put("yyy", "[type I with y's]");
Map<String, String> type2 = new HashMap<>();
type2.put("xxx", "{TYPE 2 WITH x's}");
type2.put("yyy", "{TYPE 2 WITH y's}");
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("(\\$)?\\$\\{([^}]+)}").matcher(input);
while (m.find()) {
String var = m.group(2);
String repl = (m.start(1) == -1 ? type1.get(var) : type2.get(var));
if (repl != null)
m.appendReplacement(buf, Matcher.quoteReplacement(repl));
}
String output = m.appendTail(buf).toString();
System.out.println(output);
輸出
adklsfjb{TYPE 2 WITH x's}dklsjfnsdklj[type I with y's]adljfhjh
應該不是你的II型是'\ $ \ $ \ {[A-ZA-Z0-9] + \}'?對於類型I,你有沒有'[^ \ $] \ $ \ {[a-zA-Z0-9] + \}'? – AntonH
爲錯字道歉,它是'''\ $ \ $''''。對於你建議的正則表達式,我試過了,它會匹配模式前面的任何字符,例如'''fasdfasd'f $ {var}''''('''''''表示匹配) – mrawesome
你是對的,我忘了它會被包含在捕獲中。它可能需要一個預見,但我不夠好,以提供解決方案。 – AntonH