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

#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 in 012354_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

То, что вы хотите сопоставить, — это символ подчеркивания, когда после него больше нет символов подчеркивания.

Один из способов сделать это — использовать отрицательный прогноз (?!.*_) , если он поддерживается, который утверждает, что то, что находится справа, не соответствует ни одному символу, за которым следует символ подчеркивания

 _(?!.*_)
 

Демонстрация шаблона