Matcher在匹配后抛出IllegalStateException
我遇到了一些与Matches有关的奇怪问题,希望有人能够提出一些看法。
根据Java文档:
public boolean matches()...如果匹配成功,则可以通过start,end和group方法获取更多信息。
一些代码:
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”
谢谢!
编辑:哎呀,我粘贴我的addrShort声明,而不是我的addrLong
编辑2:我知道命名约定被打破。 我没有写那部分,我发誓。
更新:
这作为独立功能成功执行。
任何想法为什么它会在tomcat环境中破解?
我会看看是否可以找到任何可能影响此操作的内容,但我的addrLong是我唯一的静态变量,不会在其他地方使用。
这真让我抓狂。 我甚至尝试过:
Pattern p = Pattern.compile("(" + numberRegex + ")s(.*)");
Matcher m = p.matcher(address);
if (m.matches()) {
result.put("number", m.group(1));
在我的服务器环境中,它失败了。
更新2
它甚至可以在servlet中单独运行时运行良好。 我很难过。 任何提示或想法非常赞赏。
更新3
拧紧它,我只是将这个功能移到另一个类中。 感谢您的帮助@ mjg123,有一个当之无愧的复选标记。
这会让我永远困扰...
我复制并粘贴了你的代码,它编译并按预期运行,没有抛出异常。 你的代码是否有其他部分导致这种情况?
我的完整代码是:
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
作为其输出。