2012-11-26 74 views
2

我有一個EditText,我希望用戶能夠輸入MAC地址。在Android上輸入正確格式的MAC地址

如何限制用戶只輸入A,B,C..F和數字並以正確的格式寫入(00:11:22:33:44:55)?

如何驗證?

編輯:我發現這個代碼,做我所需要的,但與IP地址。我試圖使用你建議的正則表達式,但它們不起作用。

public void showIP(){ 
    // Set an EditText view to get user input 
    final EditText input = new EditText(this); 
    input.setInputType(InputType.TYPE_CLASS_PHONE); 
    input.setSingleLine(); 
    InputFilter[] filters = new InputFilter[1]; 
    //filter used to allow only IPv4 style address 
    filters[0] = new InputFilter() { 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
      if (end > start) { 
       String destTxt = dest.toString(); 
       String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend); 
       if (!resultingTxt.matches("^[\\dA-F]{2}(?::[\\dA-F]{2}){5}$")) { 
        return ""; 
       } /*else { 
        String[] splits = resultingTxt.split("\\:"); 
        for (int i=0; i<splits.length; i++) { 
         if (Integer.valueOf(splits[i]) >) { 
          return ""; 
         } 
        } 
       }*/ 
      } 
     return null; 
     } 
    }; 
    input.setFilters(filters); 

    input.setText(serverIP); 
    new AlertDialog.Builder(this) 
     .setTitle(R.string.ServerIP) 
     .setMessage("Change SERVER IP") 
     .setView(input) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       serverIP=input.getText().toString(); 
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
       SharedPreferences.Editor editor = settings.edit(); 
       editor.putString("IP", input.getText().toString()); 
       // Commit the edits! 
       editor.commit(); 
       view.updateServerIP(); 
      } 
     }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       //do nothing 
      } 
     }).show(); 
} 
+2

只有4個字段或使一個單一dinamycally工作(廣告':'等)。 – shkschneider

+0

我做了一個單一的工作dinameically – 88mdil

+0

分隔符可以是連字符'-'或冒號':' – Anirudha

回答

0

一般的正則表達式匹配從0-F爲char將[\dA-F]

因此,有考慮到這一點,你可以這樣做:^[\dA-F]{2}(?:[\-][\dA-F]{2}){5}$

Nothe:本(?:是一個非捕獲組。

DEMO

+0

請看看上面的編輯。 – 88mdil

+0

什麼編輯,你剛剛發佈了一堆代碼,我給你正則表達式,我不會爲你編譯它。順便說一句,我也添加了連字符作爲分隔符,並給了你一個演示。 –

+0

我不想讓你編譯我的代碼 - 我只是想知道我使用的函數是否正確...因爲我認爲你比我更有經驗 – 88mdil

0

([\da-fA-F]{2}(?:\:|$)){6}

這工作得很好,因爲你可以在這裏看到:

http://regexr.com?32ugi

如果您希望 「 - 」 還包括作爲分隔符(有效期按照標準)你可以使用這個:

([\da-fA-F]{2}(?:\:|-|$)){6}

http://regexr.com?32ugl

5

在此代碼MAC地址字段將自動生成 ':'。您也可以刪除該條件。

final EditText input = new EditText(context); 
     input.setInputType(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 
     input.setSingleLine(); 
     InputFilter[] filters = new InputFilter[1]; 

     filters[0] = new InputFilter() { 


      @Override 
      public CharSequence filter(CharSequence source, int start, int end, 
        Spanned dest, int dstart, int dend) { 
       // TODO Auto-generated method stub 
       if (end > start) { 
        String destTxt = dest.toString(); 
        String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend); 
        if (resultingTxt.matches("([0-9a-fA-F][0-9a-fA-F]:){0,5}[0-9a-fA-F]")) 
        { 

        } 
        else if(resultingTxt.matches("([0-9a-fA-F][0-9a-fA-F]:){0,4}[0-9a-fA-F][0-9a-fA-F]")){ 
         return source.subSequence(start, end)+":" ; 
        } 
        else if(resultingTxt.matches("([0-9a-fA-F][0-9a-fA-F]:){0,5}[0-9a-fA-F][0-9a-fA-F]")){ 

        } 
        else 
        { 
         return ""; 
        } 
       } 
       return null; 
      } 
     }; 
     input.setFilters(filters);