Java 正则表达式
我试图检查at字符是否只存在于android编辑视图中。我不熟悉正则表达式,并且实现了即将发布的代码。我哪里弄错了?这是我的密码Java 正则表达式,java,android,regex,Java,Android,Regex,我试图检查at字符是否只存在于android编辑视图中。我不熟悉正则表达式,并且实现了即将发布的代码。我哪里弄错了?这是我的密码 try { Pattern pattern = Pattern.compile("/@"); Matcher matcher = pattern.matcher(valEmail); if (!matcher.matches()) { Toast.makeText(this," Invid
try {
Pattern pattern = Pattern.compile("/@");
Matcher matcher = pattern.matcher(valEmail);
if (!matcher.matches()) {
Toast.makeText(this," Invid no @ character ",Toast.LENGTH_LONG).show();
}
}catch(Exception ex){}
正则表达式中有一个不应该存在的前导
/
此外,您应该使用
查找
,而不是匹配
当前代码有两个问题:
- 前导斜杠意味着它实际上是在寻找“/@”,而不仅仅是“@”。你似乎认为“/”在正则表达式中做了一些特殊的事情,但事实并非如此
- 您使用的是试图匹配整个输入的;您需要的只是在输入中的某个地方找到正则表达式的匹配项
if (!valEmail.contains("@")) {
...
}
这将检查地址是否包含任何“@”符号。如果要检查是否只有一个“@”符号,可以使用:
int atIndex = valEmail.indexOf('@');
if (atIndex == -1) {
// Handling for *no* @ sign
}
if (valEmail.indexOf('@', atIndex + 1) != -1) {
// Handling for multiple @ signs
}
// TODO: Compile this once and reuse
Pattern pattern = Pattern.compile("[^@]+@[^@]+");
Matcher matcher = pattern.matcher(valEmail);
if (!matcher.matches()) {
...
}
如果您确实想使用正则表达式,那么可以使用更复杂的电子邮件地址验证正则表达式。(有很多不同的方法具有不同的有效性级别-确保您得到一个专为正则表达式的Java风格设计的方法。)不过,我不会仅为此使用一个方法-只在您真正对模式匹配感兴趣的地方使用正则表达式
如果要将正则表达式用于“至少一个非@,后跟@,后跟至少一个非@”,可以使用:
int atIndex = valEmail.indexOf('@');
if (atIndex == -1) {
// Handling for *no* @ sign
}
if (valEmail.indexOf('@', atIndex + 1) != -1) {
// Handling for multiple @ signs
}
// TODO: Compile this once and reuse
Pattern pattern = Pattern.compile("[^@]+@[^@]+");
Matcher matcher = pattern.matcher(valEmail);
if (!matcher.matches()) {
...
}
另一方面,这:
catch(Exception ex){}
这从来都不是个好主意。请不要不加区分地忽略错误。只需在开始时使用
@
而不使用/
。matches()
方法检查整个字符串是否与正则表达式匹配。您应该使用find()
方法而不是匹配项。并且/
字符不应该在那里。但最好使用字符串的
contains()
方法,而不是所有这些if(valEmail.contains(“@”)
对于电子邮件,您可以使用下面的正则表达式
private static final String EMAIL_PATTERN = "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$";
try {
Pattern pattern = Pattern.compile(EMAIL_PATTERN);
Matcher matcher = pattern.matcher(valEmail);
if (!matcher.matches()) {
Toast.makeText(this," Invid no @ character ",Toast.LENGTH_LONG).show();
}
}catch(Exception ex){
}
对于哪一个,你有写正则表达式,我想你想要用于电子邮件?我想检查使用正则表达式的电子邮件地址中是否只有一个@字符。如果你想要正则表达式用于电子邮件,请检查我的答案。你可能想查看电子邮件验证的模式。代码的问题在于,您不需要在“@”前面加“/”谢谢您的站点解释。这很有帮助,你是对的,你想检查一下是否只有一个@字符出现。我为什么要删除它?@user1355385:为什么你认为它会这样做?你的代码很短,而且非常不正确。先把它做好。我也不认为正则表达式是性能的顶点。@ USER135355:编译正则表达式,然后使用它并不会比<代码>文本更快(或更短)。包含(“@”)< /代码>。正如StilesCrisis所说,在担心性能之前,先让代码工作起来。