2014-09-19 2 views
0

Мне нужно найти регулярное выражение для извлечения даты из имени нескольких файлов.Как извлечь секцию даты из имени файла?

В частности, у меня есть эти два формата:

  • ATC0200720140828080610.xls
  • ATC0200720140901080346_UFF_ACC.xls

Я использую эти два регулярных выражений для проверки формат имени файла:

  • ^ATC02007[0-9]{14}.xls$
  • ^ATC02007[0-9]{14}_UFF_ACC.xls$

Но мне нужно регулярное выражение для извлечения определенного раздела:

constant | yyyyMMddHHmmss | constant 
    ^  ^   ^
ATC02007 | 20140901080346 | _UFF_ACC.xls 

Оба регулярных выражений Я использую совпадать с именем файла целиком, поэтому я не могу использовать для извлечения средней части, так что это правильное выражение?

+1

как о 'fileName.substring (8,8 + 14)'? (не уверены в значениях) – assylias

+1

Используйте группы захвата. – aioobe

+0

Возможный дубликат [Использование регулярных выражений для извлечения значения в Java] (http://stackoverflow.com/questions/237061/using-regular-expressions-to-extract-a-value-in-java) –

ответ

2

Вы почти находитесь. Просто используйте круглые скобки, чтобы содержать нужные числа.

^ATC02007([0-9]{14})(_UFF_ACC)?.xls$

См example. Числа записываются в группу 1 $1.

+1

+1 good объясните, спасибо – davioooh

1

Вам необходимо использовать группы захвата.

^(ATC02007)([0-9]{14})((?:[^.]*)?\\.xls)$ 

DEMO

индекс группы 1 содержит первую константу, а группа 2 содержит дату и время, а группа 3 содержит третью константу.

String s = "ATC0200720140828080610.xls\n" + 
     "ATC0200720140901080346_UFF_ACC.xls"; 
Pattern regex = Pattern.compile("(?m)^(ATC02007)([0-9]{14})((?:[^.]*)?\\.xls)$"); 
Matcher matcher = regex.matcher(s); 
while(matcher.find()){ 
     System.out.println(matcher.group(1)); 
     System.out.println(matcher.group(2)); 
     System.out.println(matcher.group(3)); 
} 

Выход:

ATC02007 
20140828080610 
.xls 
ATC02007 
20140901080346 
_UFF_ACC.xls 
+0

или '^ (. *) ([0-9] {14}) ((?: [^.] *)? \. xls) $' –

+0

+1 спасибо __ – davioooh

Смежные вопросы