2012-06-17 120 views
1

我正在使用来自Java的模式和匹配器类来解析链接文件脚本。 我需要的文本是章节部分:(。*)java模式和匹配器

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\\{(.*)\\})"); 

,我要提取的组,但结果不是我所期待的 有没有人有任何想法使用更好的模式?

+0

这意味着您可能在文件中有一个或多个SECTION,是否正确? – verisimilitude

+0

正则表达式不适合解析匹配的可嵌套的大括号。 –

回答

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才能正确处理换行符,其他字符应该是不言自明的。

+0

非常感谢,它工作:) – Mike

0

也许你有空白,你不考虑。
试试这个:

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

请注意,我也去掉了外组从模式(我没有看到一个理由吧)。
在我的示例中,匹配后,使用组1.
请注意,只有在执行贪婪匹配时(这是默认情况下),这才会起作用。