【问题标题】:Regular Expression Android正则表达式安卓
【发布时间】:2012-04-25 06:11:33
【问题描述】:

我正在尝试检查 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){}

【问题讨论】:

  • 你为哪个写了正则表达式,我想你想要电子邮件?
  • 我想使用正则表达式检查电子邮件地址中是否只有一个@字符
  • 如果你想要邮件的正则表达式检查我的答案。
  • 您可能需要查看this site 以了解电子邮件验证的模式。您的代码的问题是您不需要“@”之前的“/”
  • 感谢网站的解释。它很有帮助,你是对的,伙计

标签: java android regex


【解决方案1】:

您当前的代码有两个问题:

  • 前导斜线表示它确实在寻找“/@”,而不仅仅是“@”。您似乎认为“/”在正则表达式中做了一些特别的事情 - 它没有。
  • 您正在使用matches(),它试图匹配输入的整体;你想要find,它只会尝试在输入中为正则表达式 somewhere 找到匹配项。

你为什么要使用正则表达式呢?为什么不只是:

if (!valEmail.contains("@")) {
    ...
}

这将检查地址是否包含任何“@”符号。如果您想检查是否只有 一个“@”符号,您可以使用:

int atIndex = valEmail.indexOf('@');
if (atIndex == -1) {
    // Handling for *no* @ sign
}
if (valEmail.indexOf('@', atIndex + 1) != -1) {
    // Handling for multiple @ signs
}

如果您确实想使用正则表达式,可以使用更复杂的电子邮件地址验证正则表达式。 (有许多具有不同有效性级别的不同的 - 确保你得到一个专为 Java 风格的正则表达式设计的。)我不会为此使用一个 just - 只在你需要的地方使用正则表达式'对模式匹配非常感兴趣。

如果您想对“至少一个非@,后跟@,后跟至少一个非@”使用正则表达式,您可以使用:

// TODO: Compile this once and reuse
Pattern pattern = Pattern.compile("[^@]+@[^@]+");
Matcher matcher = pattern.matcher(valEmail);

if (!matcher.matches()) {
    ...
}

顺便说一句:

catch(Exception ex){}

从来没有是个好主意。请不要随便忽略错误。

【讨论】:

  • 你的代码很短,而且很不正确。先把它弄好。我也不认为正则表达式是性能的巅峰。
  • @user135538​​5:编译正则表达式然后使用它不会text.contains("@")更快(或更短)。正如 StilesCrisis 所说 - 在担心性能之前先让您的代码正常工作
【解决方案2】:

对于电子邮件,您可以使用下面的正则表达式。

 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){
}

【讨论】:

    【解决方案3】:

    matches() 方法检查整个字符串是否与正则表达式匹配。您应该使用find() 方法而不是匹配项。并且/ 字符不应该存在。
    但是,您最好使用contains() 字符串方法来代替所有这些。 if(valEmail.contains("@"))

    【讨论】:

      【解决方案4】:

      您在正则表达式中有一个不应该存在的前导 /

      此外,您应该使用find,而不是matches

      【讨论】:

      • this / 打算检查是否只有一个 @ 字符存在。为什么要删除它?
      • @user135538​​5:你认为它为什么会这样做?
      【解决方案5】:

      只需在开头使用@ 而不使用/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-10
        • 2015-07-29
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多