Как извлечь слово «здравоохранение» из слова vendor_reg_analysis_healthcare.xls, используя команду регулярного выражения SO, подробно рассказав, мне нужно взять слово после третьего _ от полного имени и до точки. чтобы я мог получить название «здравоохранение» из «vendor_reg_analysis_healthcare.xls»
3 ответа
Какой инструмент вы используете для своего регулярного выражения?
В общих чертах, я думаю, что одно из следующего может работать как соответствующее выражение:
.*_([^_]*)\..*
Тогда у вас будут вещи в "захвате" номер один.
Например, в 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]
определяет класс символов, который не является (^
) символом подчеркивания; затем от нуля до многих (*
) из них))
- конец захвата\.
- с последующим буквальным периодом.*
- с последующим нулем для множества произвольных символов
Вы можете настроить компоненты этого соответствующим образом, если это не совсем то, что вы хотите.
Используя 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
.
Надеюсь это поможет!
.*_(.*)\..* <--- an 11 char regex
$echo vendor_reg_analysis_healthcare.xls|sed -r "s/.*_(.*)\..*/\1/"
healthcare
Вы должны соответствовать целиком и захватить ту часть, которую хотите. Таким образом, вы должны сопоставить все это таким образом, чтобы разделить его, чтобы получить то, что вы хотите.
.*_
будет соответствовать всему, что он может попытаться сделать, чтобы после него было _. Так что. * Съест много подчеркиваний тоже. Но не последний. Потому что _ после него должно соответствовать подчеркиванию. Так что это соответствует vendor_reg_analysis_
Теперь вы подходите как раз перед «healthcare.xls». Эта часть
(.*)\..*
говорит захватить все до буквальной точки, и захватить это. Тогда сравните с остальными. (,*)
Это регулярное .*_([^.]*).*
также будет работать, я не уверен, что это быстрее, но это 12 символов, так что один символ длиннее.