如果我想在大括号外找到TEST,BEST,FEST,我会使用以下正则表达式:
^(?:[^\{]*(?:\{.*\})*)(?:(?:[^\{]*(TEST|BEST|FEST))|(?:.*(TEST|BEST|FEST)(?!\})))
请参阅https://regex101.com/r/vB2fS0/1
但如果我想在复杂的括号外找到这些单词,例如{{something}之外的话,该怎么办?注意 {[而不仅仅是 {。 示例:
问题在于,使用1个字符 {我可以轻松使用[^\{]*
来排除它。如何使用多个字符,即单词: {[
答案 0 :(得分:1)
您可以使用捕获组来获取所需的值,并匹配所有其他值。换句话说,匹配并捕捉您需要的东西,并匹配您不需要的东西。抓住第1组值。
\{\[[^}]*}|(TEST|BEST|FEST)
请参阅regex demo
\{\[[^}]*}
匹配{[
,除了}
以外的任何0 +字符,直至第一个}
和您不需要的这些值。您需要的值在第1组中。
示例代码:
List<String> strs = Arrays.asList("{[TEST}", "{[} {[BEST}", "bla {[} {[FEST}", "TEST","{[} {[FEST", "bla {[} hi {[} TEST} {[}");
for (String str : strs)
{
Matcher m = Pattern.compile("\\{\\[[^}]*}|(TEST|BEST|FEST)").matcher(str);
while(m.find()) {
if (m.group(1) != null) {
System.out.println(m.group(1) + " found in '" + str + "'");
}
}
}
请参阅IDEONE demo
如果您需要替换这些值,请使用Matcher#appendReplacement
:
List<String> strs = Arrays.asList("{[TEST}", "{[} {[BEST}", "bla {[} {[FEST}", "TEST","{[} {[FEST", "bla {[} hi {[} TEST} {[}");
for (String str : strs)
{
Matcher m = Pattern.compile("\\{\\[[^}]*}|(TEST|BEST|FEST)").matcher(str);
StringBuffer result = new StringBuffer();
while(m.find()) {
if (m.group(1) != null) {
m.appendReplacement(result, "NEW_"+m.group(1));
} else {
m.appendReplacement(result, m.group(0));
}
}
m.appendTail(result);
System.out.println(result.toString());
}