Как выбрать строку перед тем или иным с помощью регулярного выражения?

#regex

#регулярное выражение

Вопрос:

Я пытаюсь выбрать строку перед некоторыми символами

Пример

Ввод

 test1_day1_20204503642_sye_somestring-signed.bin
test2_day2_20205032456_ade_signed.bin
test2_day3_20204503425_arj.bin
  

Вывод

 test1_day1_20204503642_sye_somestring
test2_day2_20205032456_ade
test2_day3_20204503425_arj
  

Я хочу удалить -signed.bin,_signed.bin и .bin из строки. Как я могу это сделать с помощью регулярного выражения?

Заранее спасибо.

Комментарии:

1. да, я пробовал это (.*?).bin. здесь я не могу добавить группу в check -signed

2. Сопоставьте (?:[_-]signed)?.bin$ и замените на "" . Проверьте эту демонстрацию: regex101.com/r/0Wchep/1

Ответ №1:

Вы можете использовать шаблон ([-_]signed){0,1}.bin$ и заменить эти символы пробелом

Давайте возьмем приведенный ниже код на Perl

 $str = 'test1_day1_20204503642_sye_somestring-signed.bin'
$extracted_str =~ s/([-_]signed){0,1}.bin$//gi
print $extracted_str
  

Комментарии:

1. Спасибо, шреяскар. И ваш ответ, и ответ @anubhava работают.

2. . должно быть экранировано в регулярном выражении и {0,1} может быть записано как ?

3. @anubhava да. это хорошая практика. спасибо за упоминание.

4. Не просто хорошая практика, неэкранированная точка может дать неверный результат, поскольку она будет совпадать -bin и Xbin также в конце.