如何使用java正则表达式在括号之间获取文本

时间:2015-09-18 02:09:10

标签: java regex

所以我知道这个问题可能与其他关于正则表达式的问题类似。我相信我的独特之处是因为我使用java来解析一些javascript,它可以包含括号内的括号用于匿名函数等。请考虑以下示例:

describe('a jasmine describe', function (){
    it('login', function(){
        //some function stuff
    });

    it('another it statement', function() {
        //some additional stuff
    });
});

我最终想要的是:

第1组:"茉莉花描述"

第2组:描述

的打开/关闭括号之间的所有内容

我相信我有正则表达式来获得第1组我正在寻找的是:

Pattern r = Pattern.compile("(?:describe\\s*\\(\\s*')(.*?)(?=')", Pattern.CASE_INSENSITIVE);

但我不知道如何在特定描述括号的打开/关闭之间获取内容。

2 个答案:

答案 0 :(得分:1)

正则表达式可能不是最佳工具,但您可以尝试使用正则表达式:

^(?m)(?<indent>\s*)describe\('([^']+)'[^{]+\{([\s\S]+?)\n\k<indent>\}\);

source code

  • ^(?m) - 一行的开头,多行(可以替换为 使用Pattern.MULTILINE),
  • (?<indent>\s*) - 捕获indention befeore方法,
  • describe\( - 描述后面打开parathesis
  • '([^']+)' - 在单引号之间匹配文字,如果文字可以包含',则需要修改,
  • [^{]+\{ - 将文字与第一个{
  • 匹配
  • ([\s\S]+?) - 匹配任何内容,不情愿量化
  • \n\k<indent>\}\); - 新行,然后是捕获的缩进, 然后关闭方法体,

将捕获第二组中的“茉莉花描述”,并将描述内容转换为第三组,因为额外的组indent(名为第一组)应该确保正则表达式匹配{{{{ 1}}。 1组({...})在代码中的<indent>函数之前捕获缩进,然后将其用作边界,其中完成匹配(在describe之前有适当的缩进) 。这是匹配嵌套括号的一种解决方法,但代码需要很好地格式化。

Ofcoure,是Java代码,你需要加倍}反斜杠。

答案 1 :(得分:-1)

此正则表达式根据需要匹配目标捕获组1和2:

describe\('([^']*).*?function\s*\(\)\s*\{(([^{]*\{[^}]*\})*[^}]*)\}

这将处理函数体中任意数量的非嵌套的卷曲括号输入。

请参阅live demo