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

1

Если у меня есть список имен файлов, например:

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

Как я могу сопоставить все внутри шаблона member_ {number}.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
    Вы используете модификатор без учета регистра?
  • 0
    Да. Я использую нечувствительный модификатор
Показать ещё 3 комментария
Теги:
pattern-matching

5 ответов

1

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

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

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

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

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

$ shopt -s extglob
$ echo member_!(*_rejected*).dat
member_1235435.dat
$ echo member_!(*_rejected*).*
member_1235435.dat
member_1243533.txt
member_1_1_2015.txt
0

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

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

member_1235435.dat
member_1243533.txt
member_1_1_2015.txt
0

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

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

Рабочая демонстрация

Изображение 174551

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';

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню