[第一个应用] 我正在为用户提供使用不同首选项文件的多个配置文件的选项。用户可以自己命名他们的个人资料。我创建了一个自定义对话框,在edittext中将文件名作为输入。有效文件名应仅包含[A-Z,a-z,0-9,_, - ]。我让用户知道这个限制。
每当用户输入无效字符时,我希望从edittext中删除该字符,最好显示一个toast。在简短的搜索之后,我相信这个任务可以使用正则表达式轻松执行(与我在edittext上使用textwatcher的基于天真串的方法相比)。但是,我以前从未使用过正则表达式,需要帮助。
ps - 一个有关的用例是当用户发狂并在edittext中输入随机字符时。
答案 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