2015-10-14 2 views
0

Я должен сделать замену регулярных выражений, и я использую perl для этого; .? (. *), Который похож на этотЗамена Regex с использованием perl в приложении

$ ABC = ~ S/APP _ * * _ LOG _ _ */$ 1/

печати "ABC = $ ABC \ п".

Где $ABC может быть ниже форматом до и после подстановки:

APP_184_PRD_LOG_O2_2M -> O2 
APP_184_PRD_CFC_O2_6D -> O2 
APP_046_STG_CFC_BCK_4W_1 -> BCK 
APP_050_STG_LOG_OSS_8M_2 -> OSS 
APP_050_STG_LOG_SAM_SOX_2M -> SAM_SOX 
APP_050_STG_CFC_SAM_FOR_6M_3 -> SAM_FOR 

Rules:- 
1st variable is always APP 
4th variable can be LOG or CFC 
We are concerned with variable no.5 or 6(in some cases) 
If the 6th variable has Number+(W/D/M), then 6th & 7th variable to be removed 

Замещение должен быть один вкладыш (ограничение применения).

+2

Я не вижу вопрос в любом месте вашего поста. –

+0

@ Хантер, извините .. если вопрос не был достаточно ясным ... – marcos

ответ

0

Попробуйте либо вы можете использовать отрицательный предпросмотр или положительный взгляд вперед

Отрицательный взгляд вперед

~s/APP.+?(?:LOG|CFC)_(.+?)_(?![^\d]).+/$1/

Положительный смотреть вперед

~s/APP.+?(?:LOG|CFC)_(.+?)_(?=\d).+/$1/g;

while (<DATA>) 
{ 
    $_ =~s/APP.+?(?:LOG|CFC)_(.+?)_(?![^\d]).+/$1/g; 
    print $_; 

} 

__DATA__ 
APP_184_PRD_LOG_O2_2M 
APP_184_PRD_CFC_O2_6D 
APP_046_STG_CFC_BCK_4W_1 
APP_050_STG_LOG_OSS_8M_2 
APP_050_STG_LOG_SAM_SOX_2M 
APP_050_STG_CFC_SAM_FOR_6M_3 

выход

O2 
O2 
BCK 
OSS 
SAM_SOX 
SAM_FOR 
+0

Это регулярное выражение (Negative lookback), которое отлично работает как в приложении, так и в perl. Я не могу использовать положительный ответ, потому что не могу поставить «/ g» в конце. Благодаря! – marcos

0

Вы можете использовать negative lookahead(?![^\d+].*?), то есть:

^APP.*?(?:CFC|LOG)_(.*?)_(?![^\d+].*?) 

DEMO

https://regex101.com/r/lE7oB7/1

+0

Похоже, что он отлично работает с моим требованием ... тестирование его. – marcos

+0

Если мой ответ вам помог, пожалуйста, проголосовате 1+ ▲ и принимайте его как правильный ответ, нажав галочку ✔ в середине стрелок, tks! –

+0

Я отвечу как ответ, и он работает хорошо, когда я использую его в обычной команде perl, но каким-то образом регулярное выражение (отрицательный результат) не работает корректно в приложении. Итак, я проверяю и другие ответы. – marcos

0

Это будет делать это я тоже думаю:

s/^APP_[^_]{3}_[^_]{3}_(?:LOG|CFC)_(.+)_\d[WMD](?:_\d+)?$/$1/; 

Выход:

$ perl -le 'for (@ARGV) { s/^APP_[^_]{3}_[^_]{3}_(?:LOG|CFC)_(.+)_\d[WMD](?:_\d+)?$/$1/; print }' APP_184_PRD_LOG_O2_2M APP_184_PRD_CFC_O2_6D APP_046_STG_CFC_BCK_4W_1 APP_050_STG_LOG_OSS_8M_2 APP_050_STG_LOG_SAM_SOX_2M APP_050_STG_CFC_SAM_FOR_6M_3 
O2 
O2 
BCK 
OSS 
SAM_SOX 
SAM_FOR 
$ 
+0

спасибо за ответ, регулярное выражение недостаточно гибко из-за ограничения символов {3} и в конце, если я добавлю 2 цифры, он снова не сработает. – marcos

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