ilkz
Новичок
Проблема с обработкой строк регулярным выражением
Подскажите, плиз, где грабли.
Надо вытащить из строки подобного формата:
OUTPUTS power\BIN start_limit_over end_limit_over latched_starts\BIN latched_ends\BIN pulse_width\BIN PLL_clock:inst1|PLL_clock_altpll0:inst|altpll:altpll_component|_clk0 Time_Meter:inst23|Time_Meter_lpm_counter0:inst5|lpm_counter:lpm_counter_component|cntr_enh:auto_generated|safe_q\DEC Preprocessor:inst2|inst24\DEC Preprocessor:inst2|inst40\BIN POROG\BIN;
все, что находится после слова OUTPUTS между пробелами. Ничего сложного, вроде, нет, однако составленное регулярное выражение не работает должным образом. Не могу понять где я накосячил...
И еще вопрос (в общем смысле) - почему, если я описываю класс символов, например [\w]+ и т.п., и если в конце - перед закрывающей скобкой я ставлю ЭКРАНИРОВАННЫЙ обратный слэш: [\w\\]+, то пхп ругается ошибкой Compilation failed: missing terminating ] for character class at offset ХХХ? Ведь я же экранировал слэш! Почему тогда он на него выдает ошибку?
Вот код, который обрабатывает вышеописанную строку.
В результате возвращается
-~{}~ 16.09.07 14:01:
В то же время, если класс символов описать таким образом, то ошибки не возникает: [\\\w]+. Не понимаю почему...
-~{}~ 16.09.07 14:36:
Пока что вышел из положения таким образом:
Все работет, но уже из спортивного интереса все же интересно было бы составить регулярное выражение, которое бы одно и сразу делало эту работу. А также выяснить проблему с ошибкой на \\.
Подскажите, плиз, где грабли.
Надо вытащить из строки подобного формата:
OUTPUTS power\BIN start_limit_over end_limit_over latched_starts\BIN latched_ends\BIN pulse_width\BIN PLL_clock:inst1|PLL_clock_altpll0:inst|altpll:altpll_component|_clk0 Time_Meter:inst23|Time_Meter_lpm_counter0:inst5|lpm_counter:lpm_counter_component|cntr_enh:auto_generated|safe_q\DEC Preprocessor:inst2|inst24\DEC Preprocessor:inst2|inst40\BIN POROG\BIN;
все, что находится после слова OUTPUTS между пробелами. Ничего сложного, вроде, нет, однако составленное регулярное выражение не работает должным образом. Не могу понять где я накосячил...
И еще вопрос (в общем смысле) - почему, если я описываю класс символов, например [\w]+ и т.п., и если в конце - перед закрывающей скобкой я ставлю ЭКРАНИРОВАННЫЙ обратный слэш: [\w\\]+, то пхп ругается ошибкой Compilation failed: missing terminating ] for character class at offset ХХХ? Ведь я же экранировал слэш! Почему тогда он на него выдает ошибку?
Вот код, который обрабатывает вышеописанную строку.
PHP:
if(preg_match_all('/OUTPUTS ( ?[\w\|\:]+[\\\w]?)+;/',$data[$i],$matches)){
print_r($matches);
}
PHP:
Array
(
[0] => Array
(
ВСЯ ИСХОДНАЯ СТРОКА
)
[1] => Array
(
[0] => BIN
)
)
В то же время, если класс символов описать таким образом, то ошибки не возникает: [\\\w]+. Не понимаю почему...
-~{}~ 16.09.07 14:36:
Пока что вышел из положения таким образом:
PHP:
if(preg_match('/OUTPUTS ([^;]+);/',$data[$i],$matches)){
$matches=preg_split('/ /',$matches[1]);
print_r($matches);
}