Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式_Java_Android_Regex - Fatal编程技术网

Java 正则表达式

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

我试图检查at字符是否只存在于android编辑视图中。我不熟悉正则表达式,并且实现了即将发布的代码。我哪里弄错了?这是我的密码

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所说,在担心性能之前,先让代码工作起来。