2013-07-18 2 views
0

У меня есть файл, который имеет следующий вид:Извлечение части файла внутри фигурных скобок, используя регулярные выражения

some text 
some more text 
. . . 
. . . 
data { 
1 2 3 5 yes 10 
2 3 4 5 no 11 
} 
some text 
some text 

Я хочу, чтобы извлечь data части файла, используя регулярное выражение, используя следующую процедуру:

proc ExtractData {fileName} { 
    set sgd [open $fileName r] 
    set sgdContents [read $sgd] 
    regexp "data \\{(?.*)\\}" $sgdContents -> data 
    puts $data 
} 

Но это дает следующее сообщение об ошибке:

couldn't compile regular expression pattern: quantifier operand invalid 

Я не могу понять, что не так с регулярным выражением. Любая помощь будет высоко оценен.

+1

Забавный, вы потеряли знак вопроса. Используйте '. *?' Вместо '?. *' :) – HamZa

+0

Это работает, спасибо вам большое :) Я смотрел примеры в http://www.tcl.tk/man/tcl8.4/TclCmd/regexp .htm, где механизм '?' недостаточно ясен. Если бы вы могли написать короткое объяснение о том же, это было бы очень полезно для многих людей. – Dronacharya

+0

Взгляните на [этот вопрос] (http://stackoverflow.com/questions/2301285). Что касается вашего вопроса, который вы сделали, речь идет о «опечатке», поэтому он не подходит для SO, и если вы измените его, то это будет дубликат :) – HamZa

ответ

1

Используйте это регулярное выражение

regexp {data \{(.*)\}} $sgdContents wholematch submatch 
puts $submatch 

wholematch соответствует всему шаблону. В вашем случае это

data { 
1 2 3 5 yes 10 
2 3 4 5 no 11 
} 

И submatch матчи только содержимое внутри скобки, как показано ниже:

1 2 3 5 yes 10 
2 3 4 5 no 11 
0

Следующая регулярное_выражение линия работает

regexp "data \\{\\\n(.*?)\\\n\\s*\\}" $sgdContents -> data 

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

Смежные вопросы