代码之家  ›  专栏  ›  技术社区  ›  mahju

如何使用正则表达式提取大括号中的单词?

  •  3
  • mahju  · 技术社区  · 14 年前

    我想提取所有 用大括号括起来,所以我有一个这样的表达式

    foo {bar} moo {mar}
    

    要匹配的字符串可能有任意数量的这些单词,但我开始认为我以错误的方式处理这个问题。

    我试着把大括号这个词分成几组,这样我就可以用每一个匹配词了。所以,我做了一个正则表达式:

    String rx = ".*\\{({GROUP}\\w+)\\}.*";
    

    注意:我使用的是JRegex语法,所以我需要避开一些卷曲。

    我得到的结果是一个单一的(尽管是正确的)匹配 bar mar . 我误解了什么?我该如何纠正?我可能需要用其他的量词 . 但我希望你也能帮我。

    非常感谢!

    2 回复  |  直到 14 年前
        1
  •  5
  •   Julien Hoarau    14 年前

    你的正则表达式 .*\{({GROUP}\w+)\}.* 无法工作,因为它一次匹配所有输入字符串:

    • .* 比赛 foo
    • \{({GROUP}\w+)\} {bar}
    • 比赛 moo {mar}

    List<String> matchList = new ArrayList<String>();
    
    Pattern regex = Pattern.compile("\\{([^}]*)\\}");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) 
    {
      matchList.add(regexMatcher.group());
    } 
    

    这个正则表达式不处理内部花括号

        2
  •  2
  •   Benoit Courtine    14 年前

    http://javascript.about.com/library/blre09.htm

    List<String> matchList = new ArrayList<String>();
    
    Pattern regex = Pattern.compile("\\{(.*?)\\}");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    }
    

    语法选择权在你。这个正则表达式将具有与@madgnome的正则表达式相同的组件。个人而言,我更喜欢使用不情愿的搜索而不是字符排除。。。