2014-01-14 2 views
2

У меня есть выражение, как:признать символ новой строки с регулярным выражением в Tcl

ENTITY first 
    VHDL language standard: 3 (VHDL-2008) 
    ARCHITECTURE BODY arch 
    VHDL language standard: 3 (VHDL-2008) 

Теперь я хочу регулярное выражение только для первого paranthesis после ЛИЦА поэтому результат должен быть VHDL-2008 или даже 2008.

Я новичок в регулярных выражениях. То, что я пробовал:

"^ENTITY *(.*)" 

только возвращает «первым». Поэтому мой вопрос: как я могу запросить новую строку после «первой»? Моя попытка:

"^ENTITY .*\\n(.*)" 

И очень запутанным был результатом

"^(.*)" 

который добавил некоторые {и}. Зачем?

Я нашел очень некрасивый способ сделать это:

первой ликвидации Newlines

set data [regsub -all "\n" $data ""] 

и затем что-то вроде этого:

{ENTITY risc .*VHDL language standard: [0-3]..VHDL-(.*).} 

Как вы можете видеть, что я не сделал понять, как распознать {или (paranthesis. Лучшее решение?)

ответ

4

Предполагая, что ваше выражение хранится как одна строка, вам не нужно ничего делать, чтобы разместить новые строки: в regexp man page говорится: «По умолчанию новая строка - совершенно обычный символ, не имеющий особого значения».

Чтобы соответствовать содержимое первого набора скобок, вы можете сделать:

% set str {ENTITY first 
    VHDL language standard: 3 (VHDL-2008) 
    ARCHITECTURE BODY arch 
    VHDL language standard: 3 (VHDL-2008)} 
% regexp {^ENTITY[^(]+\(([^)]+)} $str -> vhdl 
1 
% puts $vhdl 
VHDL-2008 
% # or use non-greedy matching 
% regexp {^ENTITY.+?\((.+?)\)} $str -> vhdl 
1 
% puts $vhdl 
VHDL-2008 
+0

И если все это _isn't_ в одной строке, вы обнаружите, что RE действительно соответствует этому очень тяжело. –

+0

спасибо. Я возьму regexp '{^ ENTITY [^ (] + \ (VHDL - ([^)] +)} $ str -> vhdl', чтобы получить только число. – Sadik

+0

Это не сработает, потому что открытые круглые скобки перед VHDL не экранируются. Если вам нужен только номер, используйте 'regexp {^ ENTITY [^ (] + \ (VHDL - (\ d +)} $ str -> vhdlnum' –

1

(, ), {, }Метасимволы. Это означает, что для их признания в качестве обычных персонажей они должны быть сбежали с \ следующим образом: , \), \{ и \}.

В некоторых операционных системах новая линия - это только \n, а на других - \r\n. Регулярное выражение, которое будет соответствовать обоим, равно \r?\n.

Попробуйте использовать это регулярное выражение вместо "^ENTITY .*\\n(.*)":

ENTITY(?:.*\\r?\\n)*?.*\\((.*)\\) 

Вы можете найти демо и объяснение here.

+0

спасибо, но не похоже на работу. Он возвращает пустой {} – Sadik

+0

@Sadik, я отредактировал свой ответ. –

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