2015-05-05 3 views
0

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

test/test/abc_xyz[2][0]/abc 
test/test/abc_xyz[2]/abc 
test/test/abc_xyz/abc 

Я попытался следующие действия с помощью регулярных выражений в сценарии TCL:

set match [regexp {^.*\/*\_xyz(|\[[0-9]{1,}\]|\[[0-9]{1,}\]\[[0-9]{1,}\])\/abc} $line extracted_string ] 

Используя это регулярное выражение I удалось извлечь эти строки:

"test/test/abc_xyz[2]/abc" 
"test/test/abc_xyz/abc" 

Но не смог каким-либо образом извлечь строки, подобные этому:

test/test/abc_xyz[2][0]/abc 

Может ли кто-нибудь сказать мне, что я могу пропустить?

+0

Вашего регулярное выражения работало me (в тесте на основе java), но: (1) вы можете использовать '+' вместо '{1,}' (2) Я бы использовал необязательную группу, а не группу ORs '^. * \/* \ _ xyz (\ [[0-9] + \]) * \/abc' – beerbajay

+0

проверить мой ответ –

+0

Можете ли вы поместить больше кода, чтобы проиллюстрировать, как вы читаете файл и где происходит результат? Регулярное выражение само по себе работает нормально, хотя некоторые улучшения могут быть сделаны на нем, чтобы сделать его более эффективным. – Jerry

ответ

-1

Попробуйте это: обновление ^.*\/*\_xyz(\[\d+\])?\/abc

объяснить:

ваша проблема имеет здесь (|\[[0-9]{1,}\]|\[[0-9]{1,}\]\[[0-9]{1,}\]) блок. я думаю, что вы хотите [05] один раз после того, как xyz & перед тем /abc

(\[\d+\]) для выбора [05]

? в течение одного или более времени у

это может полезно. demo

+0

Ваш ответ был бы лучше, если бы вы объяснили, что вы сделали. В противном случае читатель должен идти по-характеру в поисках различий. Кроме того, ваша ссылка идет на тестер PCRE, но tcl не использует PCRE. –

0

В этом случае, у вас есть эта последовательность - [, цифру (ы), ] - что вы хотите, чтобы соответствовать ноль или более раз. Это приводит к следующему: (?:\[\d+\])* как общий RE. Пользуясь тем, что в месте вашего более сложной части, мы можем получить:

set match [regexp {^.*\/*\_xyz((?:\[\d+\])*)\/abc} $line extracted_string substring ] 

Это короче, и много легче понять. Я также добавил substring, чтобы получить последовательность в квадратных скобках. Работа с этим может быть лучше всего сделать с помощью продуманного string map скобок пространств:

set numbers [string map {"[" " " "]" " "} $substring] 

Теперь вы можете использовать список операции (llength, lindex, foreach и т.д.) на нем ...

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