0

カードリーダーを実装していますが、Android で正規表現を使用する必要があります。ウィキペディアに従って、track1 の正規表現は次のとおりです。

^%([A-Z])([0-9]{1,19})\^([^\^]{2,26})\^([0-9]{4}|\^)([0-9]{3}|\^)([^\?]+)\?$

ここで試してみました: http://www.regexplanet.com/advanced/java/index.html次の例で: %B6011898748579348^DOE/ JOHN ^37829821000123456789? それは機能しましたが、私のアプリケーションでは機能しませんでした。

String re = "%([A-Z])([0-9]{1,19})\\^([^\\^]{2,26})\\^([0-9]{4}|\\^)([0-9]{3}|\\^)([^\\?]+)\\?";
Pattern p = Pattern.compile(re);
String teste = "%B6011898748579348^DOE/ JOHN              ^37829821000123456789?";
Matcher m = p.matcher(teste);
    Log.d(TAG,"1111: "+m.groupCount());
int i=0;
for(i=0;i<m.groupCount();i++){
    try{
        Log.d(TAG, "GROUP"+Integer.toString(i)+" - "+m.group(i));
    }catch (IllegalStateException e){
    Log.d(TAG, e.toString());
    }
}

^ と $ と複数行でテストしましたが、何も機能しませんでした:s 結果は常に次のようになります。

1111: 6 java.lang.IllegalStateException: 今のところ成功した一致はありません java.lang.IllegalStateException: 成功しません... ...

4

1 に答える 1

1

最初に使用する必要がありますm.find()。また、最後のグループを含めて反復する必要があります。この方法を試してください

...
if(m.find()){
    Log.d(TAG,"1111: " + m.groupCount());

    //change '<' into '<=' to include group 6
    for(int i=0; i<=m.groupCount(); i++){ 
        try{
            Log.d(TAG, "GROUP"+Integer.toString(i)+" - "+m.group(i));
        }catch (IllegalStateException e){
            Log.d(TAG, e.toString());
        }
    }
}
于 2013-03-28T17:26:32.807 に答える