【问题标题】:How to use java regex to get text between brackets如何使用java正则表达式获取括号之间的文本
【发布时间】:2015-12-15 01:21:39
【问题描述】:

所以我知道这个问题可能与其他关于正则表达式等的问题相似。我相信我的是独一无二的,因为我使用 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);

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

【问题讨论】:

  • function(){} 不是 java。你真的在使用javascript吗?还是您使用 java 从 javascript 文件中获取信息?
  • 我正在使用 java 来解析一些 javascript,问题也得到了澄清
  • 如果你有无限嵌套大括号的潜力,你将无法使用正则表达式方便地做到这一点。
  • 我肯定不会有无限的嵌套大括号,我不需要关心性能。
  • 目标是否总是跟随文本“描述”?

标签: java regex


【解决方案1】:

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

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

DEMO

  • ^(?m) - 行首,多行(可以替换为 使用 Pattern.MULTILINE),
  • (?&lt;indent&gt;\s*) - 在方法之前捕获缩进,
  • describe\( - 描述,然后是对句的开头
  • '([^']+)' - 单引号之间的匹配文本,如果文本可以包含',则需要修改,
  • [^{]+\{ - 匹配文本到第一个 {
  • ([\s\S]+?) - 匹配任何东西,不情愿的 quantifire
  • \n\k&lt;indent&gt;\}\); - 新行,然后是捕获的缩进, 然后关闭方法体,

它将捕获第二组中的“茉莉花描述”,并将描述内容放入第三组,因为附加组indent(命名为第一组),这应该确保正则表达式将匹配{...} 的内容。第 1 组 (&lt;indent&gt;) 捕获代码中 describe 函数之前的缩进,然后将其用作边界,在此完成匹配(在 } 之前有适当的缩进)。这是匹配嵌套括号的一种解决方法,但代码需要格式正确。

当然,是 Java 代码,你需要双 \ 反斜杠。

【讨论】:

    【解决方案2】:

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

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

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

    live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 2019-01-20
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多