【问题标题】:java pattern and matcherjava模式和匹配器
【发布时间】:2012-06-17 07:46:28
【问题描述】:

我正在使用 Java 中的 Pattern 和 Matcher 类来解析链接文件脚本。 我需要的文字在 SECTIONS 部分:

SECTIONS
    {
        .text : {} > FAST_MEM /* Link all .text sections into ROM */
        .intvecs : {} > 0x0 /* Link interrupt vectors at 0x0 */
        .data : /* Link .data sections */
        {
            tables.obj(.data)
            . = 0x400; /* Create hole at end of block */
        } = 0xFF00FF00 > EEPROM /* Fill and link into EEPROM */
        ctrl_vars: /* Create new ctrl_vars section */
        {
            ctrl.obj(.bss)
        } = 0x00000100 > SLOW_MEM /* Fill with 0x100 and link into RAM */
        .bss : {} > SLOW_MEM /* Link remaining .bss sections into RAM */
    }

我现在正在使用

Pattern SectPattern = Pattern.compile("(SECTIONS\\{(.*)\\})");

我想提取 (.*) 组,但结果不是我所期望的 有没有人对更好的模式有任何想法?

【问题讨论】:

  • 这意味着您的文件中可能有一个或多个 SECTION,对吗?
  • 正则表达式不是解析匹配的可嵌套大括号的正确选择。

标签: java regex matcher


【解决方案1】:

这将匹配并打印 SECTIONS {} 中的内容。:

Pattern pattern = Pattern.compile("SECTIONS.*?\\{(.*)\\}", Pattern.DOTALL);
Matcher matcher = pattern.matcher(sample);
matcher.find();

System.out.println(matcher.group(1));

sample 是您的模式示例。 Pattern.DOTALL 需要正确处理换行符,其他的应该是不言自明的。

【讨论】:

    【解决方案2】:

    也许您有没有考虑到的空格。
    试试这个:

    "SECTIONS\\s*\\{(.*)\\}"
    

    请注意,我还从模式中删除了外部组(我看不出这样做的原因)。
    在我的示例中,匹配后,使用组 1。
    请注意,这仅在您进行贪婪匹配时才有效(默认情况下是这种情况)。

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多