使用regex从EditText验证[Preference]文件名

时间:2014-10-17 22:37:22

标签: java android regex android-edittext

[第一个应用] 我正在为用户提供使用不同首选项文件的多个配置文件的选项。用户可以自己命名他们的个人资料。我创建了一个自定义对话框,在edittext中将文件名作为输入。有效文件名应仅包含[A-Z,a-z,0-9,_, - ]。我让用户知道这个限制。

每当用户输入无效字符时,我希望从edittext中删除该字符,最好显示一个toast。在简短的搜索之后,我相信这个任务可以使用正则表达式轻松执行(与我在edittext上使用textwatcher的基于天真串的方法相比)。但是,我以前从未使用过正则表达式,需要帮助。

ps - 一个有关的用例是当用户发狂并在edittext中输入随机字符时。

2 个答案:

答案 0 :(得分:1)

以下是上述特定场景的工作代码,我们将textwatcher附加到我们的edittext,然后使用模式验证输入(Thnaks to huidube):

    profile_name.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) { }

        @Override
        public void afterTextChanged(Editable s) {
            String str = s.toString();
            if (!(str.matches("[a-zA-Z0-9-_ ]*"))) {
                str = removeIllegalChar(str).trim(); //trim whitespaces
                profile_name.setText(str);
                profile_name.setSelection(str.length());  //use only if u want to set cursor to end
            }
        }
    });

    private String removeIllegalChar(String str) {
    for (int i=0; i < str.length(); i++) {
        if (!(String.valueOf(str.charAt(i)).matches("[a-zA-Z0-9-_ ]*"))) {
            //as the callback is called for each character entered, we can return on first non-match
            //maybe show a short toast        
            return str.substring(0, i) + str.substring(i+1);
        }
    }
    return str;
}

我有两个测试设备,一个是垂死的老兵和一个Moto G,上面的程序在两者上都很顺利。所以,我想这是可以接受的最佳选择。

答案 1 :(得分:0)

每次输入完成后,我都会检查每个字母是否与正则表达式匹配。

我正在使用http://regexpal.com/

你需要这样的东西:

public String validateInput(String input){
    String input = "yourStr1ng$";
    for (int i = 0; i < input.length(); i++) {
        if ((input .charAt(i) + "").matches("[1-9]||[a-z]")) {
            System.out.println(input.charAt(i) + " matching");
        } else {
            System.out.println(input.charAt(i) + " failed");
            //removeLetter(input charAt(i));
        }
    }
    return true;
}

返回:

y matching
o matching
u matching
r matching
S failed
t matching
r matching
1 matching
n matching
g matching
$ failed