#regex #regex-group
#регулярное выражение #регулярное выражение-группа
Вопрос:
Мне нужно создать регулярное выражение, чтобы найти последнее подчеркивание в строке, например 012344_2.0224.71_3
или 012354_5.00123.AR_3.335_8
Я хотел найти последнюю часть с выражением [^.] $
, а затем найти подчеркивание в найденном элементе, но я не могу с этим справиться.
Надеюсь, вы сможете мне помочь 🙂
Комментарии:
1. Чтобы было ясно, вы хотите получить ‘3’ и ‘8’ из ваших примеров?
2. Не совсем. Я хочу найти последний символ подчеркивания. Один элемент перед ‘3’ и ‘8’.
3. Пожалуйста, для этого и будущих вопросов о регулярных выражениях не забудьте указать инструмент или язык программирования, на котором вы кодируете регулярное выражение, поскольку механизмы регулярных выражений могут различаться
Ответ №1:
Просто используйте класс отрицательных символов [^_]
, который будет соответствовать всему, кроме символа подчеркивания (это помогает гарантировать, что другие символы подчеркивания впоследствии не будут найдены) и конец строки $
Шаблон будет выглядеть так:
(_)[^_]*$
Последнее подчеркивание _
находится в группе захвата, поэтому вы хотите вернуть вложенное соответствие. Вы бы заменили группу 1 (ваше подчеркивание).
Смотрите это вживую: Regex101
Обратите внимание на выделенную зеленым цветом часть в Regex101, это ваше подчиненное выражение, и оно будет заменено.
Комментарии:
1. Это почти ответ. Мне нужно только последнее подчеркивание, без числа после него.
2. Итак, вы хотите вернуть
5
in012354_5.00123.AR_3.335_8
?3. Я хочу вернуть только _ между 5 и 8.
4. Вы хотите вернуть буквенное подчеркивание
_
? Зачем использовать регулярное выражение, если вы уже знаете, что собираетесь вернуть символ подчеркивания?5. Потому что мне нужно заменить только последний символ в строке. Самый простой способ для инструмента StringReplacer в программном обеспечении FME найти последнее подчеркивание — это регулярное выражение.
Ответ №2:
Самое простое решение, которое я могу себе представить, — это использовать .*K_
, однако не все варианты регулярных выражений поддерживают K
.
Если нет, другой идеей было бы использовать _(?=[^_]*$)
У вас есть демонстрация первого и второго варианта.
Объяснение:
.*K_
: Извлекает любой символ до подчеркивания. Поскольку *
квантификатор является жадным, он будет совпадать до последнего подчеркивания. Затем K
отбрасывается предыдущее совпадение, а затем мы сопоставляем подчеркивание.
_(?=[^_]*$)
: Извлекать символ подчеркивания, которому предшествуют символы без подчеркивания, до конца строки
Ответ №3:
Если вы не хотите ничего, кроме «net» (т. Е. Ничего не соответствует, кроме последнего подчеркивания), используйте положительный предварительный просмотр, чтобы убедиться, что в строке больше нет подчеркиваний:
/_(?=[^_]*$)/gm
Ответ №4:
Шаблон [^.] $
не соответствует точке 1 раз, а затем утверждает конец строки. Даст вам совпадения 71_3
и 335_8
То, что вы хотите сопоставить, — это символ подчеркивания, когда после него больше нет символов подчеркивания.
Один из способов сделать это — использовать отрицательный прогноз (?!.*_)
, если он поддерживается, который утверждает, что то, что находится справа, не соответствует ни одному символу, за которым следует символ подчеркивания
_(?!.*_)