正则表达式在Java中搜索{{和}}之间的关键字

时间:2017-02-24 14:05:42

标签: java regex regex-lookarounds

Java中{{}}之间的正则搜索关键字是什么。

示例String = "kksdkjhsd {{one}} sdkjhsdjksd {{two}}" 我想要output = ["one","two"];

我已经尝试过在Java Regex to get Data between curly brackets中建议的方法。

单支撑可以正常工作,但我不能将它扩展为双花({{ }})括号

3 个答案:

答案 0 :(得分:5)

此代码应符合您的要求:

Matcher m = Pattern.compile("\\{\\{([^\\}]*)\\}\\}").matcher(word);

while (m.find()){
    System.out.println(m.group(1));
}

此正则表达式会将{{ }}中的所有文字都归结为}个字符。此正则表达式不处理{{{}}}之类的案例限制,在这种情况下会返回{,因为只有前两个{{匹配。

如果您需要一个与范围内的单个花括号匹配的正则表达式,我们需要一个更复杂的解决方案。

另一件事,使用字符类([^\\}]*)使正则表达式比(.*?)更有效,因为它将停止搜索第一个字符,而不是一个封闭的大括号。

答案 1 :(得分:2)

您可以使用正则表达式:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static final String REGEX_START = Pattern.quote("{{");
    public static final String REGEX_END = Pattern.quote("}}");
    public static final Pattern PATTERN = Pattern.compile(REGEX_START + "(.*?)" + REGEX_END);

    public static void main(String[] args) {
        String input = "kksdkjhsd {{one}} sdkjhsdjksd {{two}}";
        List<String> keywords = new ArrayList<>();

        Matcher matcher = PATTERN.matcher(input);

        // Check for matches
        while (matcher.find()) {
            keywords.add(matcher.group(1)); // Group one is necessary because of the brackets in the pattern
        }

        // Print
        keywords.forEach(System.out::println);
    }
}

这将为您提供{{}}之间的所有内容,以便您获得如下结果:

one
two

答案 2 :(得分:0)

您可以尝试使用正则表达式[{][{].*?[}][}]。它使用不情愿的量词*?,它匹配零个或多个字符,但是以非贪婪的方式,因此,一旦它开始匹配{{,它将在它遇到的第一个}}处停止,而不是一直到字符串的末尾并匹配 last }}

作为一个有趣的额外内容,它可以匹配hey {{ how {} are }} you之类的内容,并生成how {} are作为输出,而基于[^}]*的正则表达式不能。{/ p>