Как насчет:
(.*?)_[^_]*
Тогда результат, который вам нужен, находится в группе 1. (Вы не указали язык, так что я так далеко.)
Существует несколько способов сделать это; Я уверен, что вы могли бы использовать lookahead или lookbehind. Что я сделал, это:
- Подберите как можно больше символов (но не жадно). Сохраните их в группе.
- Соответствует подчеркиванию.
- Соответствует любому количеству символов, если они не подчеркивания.
Это потребует некоторого возврата, поэтому, если это критичный к производительности фрагмент кода, вам может потребоваться оптимизировать его больше, чем я.
Лучшим решением было бы начать с конца строки и считать в обратном порядке до подчеркивания, а затем взять подстроку от 0 до этого индекса. Это, вероятно, будет намного быстрее и понятнее, чем использование регулярных выражений. Например, в Java:
public static String getUpToUnderscore(String str) {
return str.substring(0, str.lastIndexOf('_'));
}