Как извлечь слово «здравоохранение» из слова vendor_reg_analysis_healthcare.xls, используя команду регулярного выражения SO, подробно рассказав, мне нужно взять слово после третьего _ от полного имени и до точки. чтобы я мог получить название «здравоохранение» из «vendor_reg_analysis_healthcare.xls»

3 ответа3

2

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

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

.*_([^_]*)\..*

Тогда у вас будут вещи в "захвате" номер один.

Например, в Perl это может быть:

$s = "vendor_reg_analysis_healthcare.xls";
$s =~ /.*_([^_]*)\..*/;
print $1, "\n";

Или, если вы хотите изменить $ s на месте:

$s =~ s/.*_([^_]*)\..*/$1/;

Теперь $ s будет содержать "здравоохранение".

Так... Вышеупомянутое выражение будет захватывать конкретно последнюю вещь после _ и до . , Если число _ является переменным, это может или не может быть тем, что вы хотите. Например, если у вас нет подчеркивания, это не будет соответствовать. Или, если у вас было 4, и вы хотели, чтобы подчеркивание, которое произошло после 3-го, оставалось частью результирующей строки, это тоже было бы неправильно.

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

.*_\([^_]*\)\..*

например, с помощью sed (как уже упоминалось в другом ответе, хотя вы упоминаете Windows, поэтому я полагаю, что это не ваш инструмент выбора):

echo vendor_reg_analysis_healthcare.xls | sed -e 's/.*_\([^_]*\)\..*/\1/'

В любом случае, это дает вам то, что вам нужно? Если нет, пожалуйста, уточните, в каком контексте (движке, программном обеспечении и т.д.) Используются ваши регулярные выражения ("ТАК" - это часть программного обеспечения? Я не знал, что означала эта часть вашего поста, и / или более конкретных деталей того, что вы ищете.

И для чего это стоит, вот части вышеприведенного выражения, в разбивке:

  • .* - сожрать как можно больше символов (от нуля до многих (*) любого символа (.))
  • _ - с последующим подчеркиванием
  • ( - начать захватывать
  • [^_]* - захват нуля для многих символов, не являющихся подчеркиванием ([ to ] определяет класс символов, который не является (^) символом подчеркивания; затем от нуля до многих (*) из них)
  • ) - конец захвата
  • \. - с последующим буквальным периодом
  • .* - с последующим нулем для множества произвольных символов

Вы можете настроить компоненты этого соответствующим образом, если это не совсем то, что вы хотите.

0

Используя Ubuntu Linux, я создал файл с тем же именем, а затем использовал следующие команды, объединенные вместе, чтобы отобразить только слово «здравоохранение».

vagrant@dev:~$ ls vendor_reg_analysis_healthcare.xls | sed -e s/_/./g |  cut -d '.' -f4
healthcare

Команда ls "выводит" имя файла vendor_reg_analysis_healthcare.xls . Отсюда мы передаем вывод ls в sed и заменяем каждый экземпляр подчеркивания точкой. Зачем? Потому что теперь мы можем использовать . как общий разделитель, поэтому, когда мы передаем новое имя файла vendor.reg.analysis.healthcare.xls команде cut мы теперь говорим: «cut all, кроме четвертого поля», которое является словом « healthcare .

Надеюсь это поможет!

0
.*_(.*)\..*    <--- an 11 char regex 


$echo vendor_reg_analysis_healthcare.xls|sed -r "s/.*_(.*)\..*/\1/"
healthcare

Вы должны соответствовать целиком и захватить ту часть, которую хотите. Таким образом, вы должны сопоставить все это таким образом, чтобы разделить его, чтобы получить то, что вы хотите.

.*_ будет соответствовать всему, что он может попытаться сделать, чтобы после него было _. Так что. * Съест много подчеркиваний тоже. Но не последний. Потому что _ после него должно соответствовать подчеркиванию. Так что это соответствует vendor_reg_analysis_

Теперь вы подходите как раз перед «healthcare.xls». Эта часть

(.*)\..*

говорит захватить все до буквальной точки, и захватить это. Тогда сравните с остальными. (,*)

Это регулярное .*_([^.]*).* также будет работать, я не уверен, что это быстрее, но это 12 символов, так что один символ длиннее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .