【问题标题】:Codename One - RegexConstraint to check a valid phone number代号一 - RegexConstraint 检查有效的电话号码
【发布时间】:2018-07-07 00:07:17
【问题描述】:

在下面的代码中,RegexConstraint 不起作用,因为电话号码的结果总是不正确。怎么了?我需要检查一个手机号码(没有国家代码)。例如,输入 3652312453 应该是正确的,但在下面的代码中它被评估为不正确。 我从评论中链接的讨论中复制了正则表达式:我唯一的要求是有效的电话号码。

(注意:这个问题不是针对通用Java,而只是针对Codename One。“CountryCodePicker”类扩展了“Button”类:我报告它是为了明确电话号码和国家代码分开)

    TextModeLayout tl = new TextModeLayout(1, 1);
    Container loginContainer = new Container(tl);
    TextComponent phone = new TextComponent().label("PHONE").errorMessage("INVALID-PHONE");
    CountryCodePicker countryCode = new CountryCodePicker();
    phone.getField().setConstraint(TextArea.PHONENUMBER);
    loginContainer.add(phone);
    Container loginContainerWithCodePicker = new Container(new BoxLayout(BoxLayout.X_AXIS_NO_GROW));
    loginContainerWithCodePicker.add(countryCode).add(loginContainer);
    // https://stackoverflow.com/questions/8634139/phone-validation-regex
    String phoneRegEx = "/\\(?([0-9]{3})\\)?([ .-]?)([0-9]{3})\\2([0-9]{4})/";
    val.addConstraint(phone, new RegexConstraint(phoneRegEx, "NOT-VALID-NUMBER"));
    Button loginButton = new Button("LOG-IN");
    val.addSubmitButtons(loginButton);

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    Oracle 的 Java 8 课程中的以下资源帮助我始终定义我需要的 RegEx。花点时间研究它,你会成功的,尤其是问题似乎出在 Constraint 对象的初始化上。我在这里发帖的前一天遇到了一个问题,并设法优雅地解决了它,这始终是我们的目标。

    使用此链接 https://docs.oracle.com/javase/tutorial/essential/regex/
    Oracle 教程:“课程:正则表达式”。

    【讨论】:

    • 这是一个老问题,从那以后我一直在尝试遵循 Shai 的建议,即覆盖约束的 isValid 方法,而不是使用正则表达式,这样我就有了易于阅读的代码。无论如何,我感谢您的回答,因为它可能会派上用场。
    • @FrancescoGalgani 好吧,我曾经遇到过与 Shai 在 RegEx 中遇到(有?)相同的问题,但坚持尝试使用 Java SE 提供的功能。在我看来,从头开始编码并不高效,即使您设法解决了这种方法的可维护性、复杂性和性能问题。
    • 请注意,“问题似乎出在约束对象的初始化中”是我认为超越仅链接答案的唯一想法。但这已经足够了......
    • 我不确定@Yunnosch 在他之前的评论中是什么意思。但是,感谢您尝试使答案更具可读性。问题是不同的搜索引擎不会为相同的词返回相同的结果。这是一个幂等性的问题,但同时,提及特定的搜索引擎可能会违反规则......
    • 如果搜索太棘手以至于引擎是相关的,那么坚持使用链接。链接本身不是问题。仅包含链接(和“广告”,而不是责怪您)的帖子被视为不是答案。我建议删除搜索建议或将其保留为通用的并保留。任何用户都没有必要找到您所指的完全相同的网站,只要他们在搜索主题上找到了一些东西,这是您明智地提出的。您已经获得了赞成票,如果您对所链接的内容进行更多解释和/或总结,您可能会获得更多。 IE。在这里有解决方案和链接。
    【解决方案2】:

    [咆哮] 就我个人而言,我真的很讨厌正则表达式,因为除了琐碎的验证之外,我发现它该死的不可读。 [/咆哮]

    所以我更喜欢这个:

    val.addConstraint(phone, new Constraint() {
       public  boolean isValid(Object value) {
           String v = (String)value;
           for(int i = 0 ; i < v.length() ; i++) {
              char c = v.charAt(i);
              if(c >= '0' && c <= '9' || c == '+' || c == '-') {
                  continue;
              }
              return false;
           }
           return true;
       }
    
       public String getDefaultFailMessage() {
           return "Must be valid phone number";
       }
    });
    

    但是,我猜你正则表达式失败的原因与斜杠的语法有关:

    String phoneRegEx = "^\\(?([0-9]{3})\\)?([ .-]?)([0-9]{3})\\2([0-9]{4})";
    

    【讨论】:

    • 谢谢,第一个方法更具可读性和可定制性。也许应该在 API 中报告这个机会。
    • 我尝试在 for 循环中将“iter++”替换为“i++”,但 Stack Overflow 不允许我在您的答案中进行此编辑。
    • 谢谢,错误的大脑编译器。如果您认为文档可以改进,您可以直接点击编辑并帮助我们澄清它们codenameone.com/blog/tip-edit-docs-fun-profit.html您不必担心犯错误等,因为我们会审查所有编辑并确保它们是正确的。
    猜你喜欢
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    相关资源
    最近更新 更多