1

文字列内の電子メールを検索する次の正規表現があります (文字列内に 0 個以上の電子メールがある可能性があります)。式には 4 つのグループがあり、そのうちのいくつかは null 値に一致する可能性があります。

式のRegexPlanet テスト:

          ([-A-Za-z0-9._!#$%^&*|{}'~`]+@[a-z0-9_-]+[\\.][a-z]{2,3}[\\.][a-z]{2,3})|([A-Za-z0-9.!#$%^&*|{}\"~`]+@[a-z0-9_-]+[\\.][a-z]{4})|([A-Z.a-z0-9!#$%^&*|{}'~`]+@[a-z0-9_-]+[\\.][a-z]{3})|([A-Za-z0-9.!#$%^&*_-|{}'~`]+@[a-z0-9_-]+[\\.][a-z]{2})

マッチャーからデータを読み取るコードは、ArrayOutOfBoundsExceptionat を示しています。matchValue=matcher.group(i);

   ArrayList<String> result=new ArrayList<String>();
    Pattern pattern=Pattern.compile(regex);
    Matcher matcher=pattern.matcher(input);
    Log.d(TAG,"input: "+input);
    while(matcher.find())
    {
        String matchValue=null;
        for(int i=1;i<5;i++)
        {
            matchValue=matcher.group(i);
            if(matchValue!=null && !matchValue.equals(""))
            {    
                Log.d(TAG, "Group no: "+i+" Value: "+matchValue+" adding to result");
                result.add(matchValue);
            }
            else
            {
                Log.d(TAG, "Nothing matched for group i");
            }
        }    
    }
    return result;
}

コードに何か問題がありますか、それとも他の何かの副作用ですか?

貴重なご提案をありがとうございました

4

2 に答える 2

2

どの入力が例外を引き起こすか知っていますか? 一般に、この例外を回避するには、forループを次のように書き換えます。

for(int i=1;i<=matcher.groupCount();i++)
        {....}
于 2013-11-06T06:12:05.973 に答える
1

これを試して:

for(int i=1; i <= matcher.groupCount(); i++)
{
    matchValue=matcher.group(i);
    ...

あなたが持っているコードで問題が発生する理由がわかりません。正確に 4 つのグループがあるfor(int i=1; i<5;ようで、正しいようです。しかし、マッチャーにカウントが何であるかを教えてもらう方が良いでしょう。

于 2013-11-06T06:17:21.743 に答える