【问题标题】:Validating IP never succeeds验证 IP 永远不会成功
【发布时间】:2015-06-20 10:06:18
【问题描述】:

用户在 EditTextPreference 中输入 IP 地址,我尝试使用以下代码验证 IP:

private EditTextPreference ipPref;
private Matcher matcher;
private SharedPreferences settings;
private final Pattern IP_ADDRESS
    = Pattern.compile(
    "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]"
    + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]"
    + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
    + "|[1-9][0-9]|[0-9]))");

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);

    //PREF_IP is the android:key of the EditTextPreference
    ipPref = (EditTextPreference) getPreferenceManager().findPreference("PREF_IP"); 
    settings = PreferenceManager.getDefaultSharedPreferences(this);
    matcher = IP_ADDRESS.matcher(settings.getString("PREF_IP", "0.0.0.0"));

ipPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {            
        public boolean onPreferenceChange(Preference preference, Object newValue) {

            try 
            {
                if(matcher.matches()){
                    Log.d("settings", "matches!");
                    return true;
                }else{
                    Log.d("settings", "doesn't match!");
                    return false;
                }
            }
            catch(Exception e)
            {
                return false;
            }
        }
    }); 
}

如果我输入了一个有效的 IP 地址,代码永远不会认为它是有效的,并且日志会显示“不匹配!”。我做错了什么?

【问题讨论】:

  • 你应该在 onPreferenceChange() 方法中创建你的匹配器,而不是预先创建它。
  • @GuillaumePolet 不会改变任何东西。
  • 是的,它改变了一切。但我不确定你的正则表达式是否正确
  • @GuillaumePolet :我试过了,但行为没有改变......我的意思是。正则表达式应该没问题,我从stackoverflow.com/questions/3698034/validating-ip-in-android得到它
  • 不知道 Android 的确切内部结构,但如果你在 onPreferenceChange() 方法中使用这样的东西,它应该可以工作:IP_ADDRESS.matcher(newValue.toString()).matches()

标签: java android validation ip matcher


【解决方案1】:

将onPreferenceChange() 方法中的测试更改为:

 IP_ADDRESS.matcher(newValue.toString()).matches()

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多