2013-07-25 5 views
1

Я пытаюсь извлечь номер пропуска из строк любых из следующих форматов:Почему это компилятор Java не компилируется?

PassID_132 
PassID_64 
Pass_298 
Pass_16 

Для этого я построил следующее регулярное выражение:

Pass[I]?[D]?_([\d]{2,3}) 

й протестировал его в окне поиска в Eclipse , Он работал нормально.

Однако, когда я использую его в коде, он ничего не соответствует. Вот мой фрагмент кода:

String idString = filename.replaceAll("Pass[I]?[D]?_([\\d]{2,3})", "$1"); 
int result = Integer.parseInt(idString); 

Я также попытался

java.util.regex.Pattern.compile("Pass[I]?[D]?_([\\d]{2,3})") 

в выражений окно во время отладки, но это говорит "", в то время как

java.util.regex.Pattern.compile("Pass[I]?[D]?_([0-9]{2,3})") 

компилируется, но Бесполезный» t соответствует чему угодно. В чем может быть проблема? ?

+1

"\\ d" уже расширяется до "[0-9]", не помещайте его в скобки! Вы также можете сбрасывать скобки на одиночные буквы типа «I» или «D». Попробуйте «Pass (?: ID)? _ (\\ d {2,3})» – AKDADEVIL

ответ

1

Там нет ничего недействителен с tegex, но это отстой. Вам не нужны классы символов вокруг одиночных символов. Попробуйте следующее:

"Pass(?:ID)?_(\\d{2,3})" 
+0

Спасибо. Моя проблема на самом деле заключалась не в том, что мое регулярное выражение не соответствовало, но оно не охватывало всю строку, т. Е. Был более релевантный текст до и после части, соответствующей регулярному выражению, которое не было удалено. –

2

Вместо перевала [I] [D] _ ([\ г] {2,3}) попробуйте это:

Pass(?:I)?(?:D)?_([\d]{2,3}) 
+0

Обратите внимание, что его также будут соответствовать «PassD_123» или «PassI_321» – Ingo

+0

True, и так будет мое регулярное выражение, но я могу себе это позволить. Появятся только Pass_ и PassID_. –

+0

И все еще получает цифровую часть. Я просто следую за шаблоном, который следует в вопросе, где ответчик пытается сделать необязательным «I» и «D» – morgano

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