2015-12-11 3 views
1

Если у меня есть список имя файла например .:Как сопоставить шаблон, но рисунок на регулярное выражение

member_1235435.dat 
member_1243533.txt 
member_1_1_2015.txt 
member_1_3_2015_rejected.dat 

Как я могу соответствовать всем в структуре member_ {число} .extension, кроме тех, с _rejected?

До сих пор я так:

^Member_.*.* 

Я думал, что это будет выглядеть, но это не работает.

^Member_.*(?!_rejected).* 

я попробовал первый ответ на комментарий

24646-MBPRS-Username:myapp Username$ ./src/myapp launcher:local ~/Desktop/myfilesdirectory /^member_(?:.(?!_rejected))*$/ 
-bash: !_rejected: event not found 

Я пытался бежать! знак, это то, что я получил

24646-MBPRS-Username:myapp Username$ ./src/myapp launcher:local ~/Desktop/myfilesdirectory /^member_(?:.(?\!_rejected))*$/ 
-bash: syntax error near unexpected token `(' 

FYI, шаблон будет проходить через параметр командной строки

+0

Вы используете регистрозависимости модификатор? – chris85

+0

Да. Я использую нечувствительный модификатор – Harts

+3

'^ member _ (?:. (?! _ Reject)) * $' - https://regex101.com/r/cR9bF3/1 –

ответ

1

Если допустимые имена имеют комбинации чисел и _ после member_ вы можете просто использовать следующее регулярное выражение:

^member_[\d_]+\.\w+$ 
0

Первый ответ работает. Я использовал этот код для проверки:

<?php 
$s = [ 
    'member_1235435.dat', 
    'member_1243533.txt', 
    'member_1_1_2015.txts', 
    'mber_1_1_2015.txt', 
    'member_1_3_2015_rejected.dat' 
]; 

echo preg_match('/^member_[\d_]+\.\w+$/', $s[1]) ? 'yes' : 'no'; 

В случае, если вы хотите использовать расширение с 3-х букв, используйте '/^member_[\d_]+\.\w{3}$/'.

+0

он не работает, когда я запускал его в командной строке, он дал мне -bash:! _rejected: event not found – Harts

+0

Ну, я пытаюсь использовать этот код из файла index.php, работающего из среды Eclipse/PDT. Возможно, bash анализирует некоторый код как команду ... – ranieribt

0

Вы можете использовать метод сбрасывания с использованием регулярных выражений, как это:

.*rejected(*SKIP)(*FAIL)|^.* 

Working demo

enter image description here

0

с использованием ".EXT" в качестве терминатора после численного срока.

$ grep -Eo 'member_[0-9_]+\.(.*)$' file 

member_1235435.dat 
member_1243533.txt 
member_1_1_2015.txt 
0

В bash шаблоны имен файлов не являются регулярными выражениями. Это "globs".

Даже если существуют регулярные выражения, такие как внутри [[...]], утверждения lookahead не реализованы.

Однако, вы можете использовать расширенные шарики, как описано в руководстве Баш связаны выше:

$ shopt -s extglob 
$ echo member_!(*_rejected*).dat 
member_1235435.dat 
$ echo member_!(*_rejected*).* 
member_1235435.dat 
member_1243533.txt 
member_1_1_2015.txt 
Смежные вопросы