Matcher бросает IllegalStateException после матчей
У меня возникли некоторые странные проблемы со спичками, надеясь, что кто-то сможет пролить свет.
Согласно Java docs:
Открытые логические соответствия() ... Если матч удался тогда больше информации можно получить через начало, конец, и групповые методы.
Некоторый код:
private static Hashtable<String,String> splitAddress(String address){
Hashtable<String,String> result = new Hashtable<String,String>();
Matcher m = addrLong.matcher(address);
if (m.matches()) {
result.put("number", m.group(1));
Вот куда он бросает:
java.lang.IllegalStateException: No match found
java.util.regex.Matcher.group(Matcher.java:485)
splitAddress(WebServiceHelper.java:699)
Уже одно это кажется мне странным. Вот еще немного информации, если это поможет:
private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123
private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST";
private static final String typeRegex = "STREET|ST|DRIVE|DR|AVENUE|AVE|AV|ROAD|RD|LOOP|LP|COURT|CT|CIRCLE|LANE|LN|BOULEVARD|BLVD|CRESCENT|CR";
addrLong = Pattern.compile("(" + numberRegex + ")\s(.*)\s(" + typeRegex + ")\s?(" + compassRegex + ")?");
Входная строка, которую я тестировал, - это " 12 CLARE ST E "
Спасибо!
Edit: Ой, я вставил свою декларацию addrShort вместо моей addrLong
Edit2: я знаю, что соглашения об именовании нарушаются. Клянусь, я не писал эту часть.
Обновление:
Это успешно выполняется как автономная функция.
Есть идеи, почему он сломается в среде tomcat?
Я посмотрю, смогу ли я найти что-нибудь, что может повлиять на это, но мой addrLong-это моя единственная статическая переменная и больше нигде не используется.
Это сводит меня с ума. Я даже попробовал:
Pattern p = Pattern.compile("(" + numberRegex + ")\s(.*)");
Matcher m = p.matcher(address);
if (m.matches()) {
result.put("number", m.group(1));
В моей серверной среде, и это не удается.
Обновление 2
Он даже работает нормально, когда он один в сервлете. Я в тупике. Любые намеки или идеи очень ценятся.
Обновление 3
К черту, я просто перемещаю функцию в другой класс. Спасибо за вашу помощь @mjg123, есть заслуженная галочка.
Это будет беспокоить меня. навсегда...
1 ответ:
Я скопировал и вставил ваш код, и он компилируется и запускается, как ожидалось, без исключения. Есть ли какая-то другая часть вашего кода, вызывающая это?
Мой полный код:
public class StackOverflow { private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123 private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST"; private static final String typeRegex = "STREET|ST|DRIVE|DR|AVENUE|AVE|AV|ROAD|RD|LOOP|LP|COURT|CT|CIRCLE|LANE|LN|BOULEVARD|BLVD|CRESCENT|CR"; private static final Pattern addrLong = Pattern.compile("(" + numberRegex + ")\\s(.*)\\s(" + typeRegex + ")\\s?(" + compassRegex + ")?"); public static void main(final String[] args) { final String address = "12 CLARE ST E"; final Hashtable<String, String> result = splitAddress(address); System.out.println(result.get("number")); } private static Hashtable<String, String> splitAddress(final String address) { final Hashtable<String, String> result = new Hashtable<String, String>(); final Matcher m = addrLong.matcher(address); if (m.matches()) { result.put("number", m.group(1)); } return result; } }
, который отлично работает и выводит на экран
12
.