Java-шаблон и сопоставитель

Я использую классы Pattern и Matcher из Java для анализа скрипта файла ссылки. Текст, который мне нужен, находится в части 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\\{(.*)\\})");

и я хочу извлечь группу (.*), но результат не такой, как я ожидал. У кого-нибудь есть идеи по лучшему шаблону?


person Mike    schedule 17.06.2012    source источник
comment
так что это означает, что в вашем файле может быть один или несколько РАЗДЕЛОВ, верно?   -  person verisimilitude    schedule 17.06.2012
comment
Регулярные выражения не являются правильным выбором для синтаксического анализа совпадающих вложенных фигурных скобок.   -  person Judge Mental    schedule 17.06.2012


Ответы (2)


Это сопоставит и напечатает содержимое внутри РАЗДЕЛОВ { и }.:

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

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

где sample — образец вашего шаблона. Pattern.DOTALL требуется для правильной обработки разрывов строк, остальные не требуют пояснений.

person Kristof Jozsa    schedule 17.06.2012

Возможно, у вас есть пробелы, которые вы не учитываете.
Попробуйте следующее:

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

Обратите внимание, что я также удалил внешнюю группу из шаблона (не вижу для этого причин).
В моем примере после сопоставления используйте группу 1.
Обратите внимание, что это сработает, только если вы делаете жадные соответствует (что имеет место по умолчанию).

person EyalAr    schedule 17.06.2012