Поиск символов перед последним подчеркиванием - PullRequest
1 голос
/ 17 июня 2009

Кто-нибудь знает, как найти все символы перед последним подчеркиванием в имени файла.

IABU_Real_Egypt_AUS09_012.indd

Мне нужен результат: IABU_Real_Egypt_AUS09

Заранее спасибо

Ответы [ 4 ]

7 голосов
/ 17 июня 2009

/(.*)_/ и принять значение захвата. Регулярные выражения, как правило, жадные, поэтому они автоматические (вам не нужен класс отрицательных символов).

irb(main):007:0> "IABU_Real_Egypt_AUS09_012.indd".match(/(.*)_/)[1]

=> "IABU_Real_Egypt_AUS09"

2 голосов
/ 17 июня 2009

Как насчет:

(.*?)_[^_]*

Тогда результат, который вам нужен, находится в группе 1. (Вы не указали язык, так что я так далеко.)

Существует несколько способов сделать это; Я уверен, что вы могли бы использовать lookahead или lookbehind. Что я сделал, это:

  1. Подберите как можно больше символов (но не жадно). Сохраните их в группе.
  2. Соответствует подчеркиванию.
  3. Соответствует любому количеству символов, если они не подчеркивания.

Это потребует некоторого возврата, поэтому, если это критичный к производительности фрагмент кода, вам может потребоваться оптимизировать его больше, чем я.

Лучшим решением было бы начать с конца строки и считать в обратном порядке до подчеркивания, а затем взять подстроку от 0 до этого индекса. Это, вероятно, будет намного быстрее и понятнее, чем использование регулярных выражений. Например, в Java:

public static String getUpToUnderscore(String str) {
    return str.substring(0, str.lastIndexOf('_'));
}
1 голос
/ 17 июня 2009

Пример без регулярных выражений в C #:

s.Substring(0, s.LastIndexOf('_'))
0 голосов
/ 17 июня 2009

Если у вас есть хотя бы 1 подчеркивание, вы можете сделать что-то вроде этого:

/(.*_[^_]+)/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...