7

誰かが光を当てることができることを願って、私はマッチでいくつかの奇妙な問題を抱えています.
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」です

ありがとう!

編集:おっと、addrLongの代わりにaddrShort宣言を貼り付けました

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 さん、ご協力ありがとうございます。当然のチェック マークを付けてください。

これは永遠に私を悩ませます...

4

1 に答える 1

3

コードをコピーして貼り付けたところ、期待どおりにコンパイルおよび実行され、例外はスローされませんでした。これを引き起こしているコードの他の部分はありますか?


私の完全なコードは次のとおりです。

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し、出力として出力されます。

于 2011-03-04T22:18:53.603 に答える