有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何检查该行是否与正则表达式(regex)冲突?

抱歉,如果这是重复的,我没有发现类似的问题,可能我遗漏了什么

我将举例说明我想要什么:

  • 假设我们有一个用于检查电子邮件的简单正则表达式

    private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

  • 我开始一个符号一个符号地输入(在一些输入字段中)email(或者不是email,而是一些字符串),并按regex检查整行

    • Enter: u
    • Line: u
    • Check: true \\ because there is a chance that I will enter right symbols further

    • Enter: s
    • Line: us
    • Check: true

      ...

    • Enter: @
    • Line: username@
    • Check: true

    • Enter: @
    • Line: username@@
    • Check: false \\ because there is no way to get correct line appending any symbols

    • Enter: d
    • Line: username@d
    • Check: true

    • Enter: .
    • Line: username@domain.
    • Check: true

    • Enter: .
    • Line: username@domain..
    • Check: false

换句话说,我想通过正则表达式检查字符串,如果有可能附加符号将给出正确的字符串,则得到肯定的结果


共 (3) 个答案

  1. # 1 楼答案

    您可以使用util包中的regex.Patternregex.Matcher

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    //...
    
    private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";    
    
    // String to be scanned to find the pattern.
    String line = "Your line";
    String pattern = EMAIL_PATTERN;
    
    // Create a Pattern object
    Pattern r = Pattern.compile(pattern);
    
    // Now create matcher object.
    Matcher m = r.matcher(line);
    
    // You can use capturing groups to partially check the line
    // e.g. for Java 6 use the following to access the first group
    String value = m.group(0);
    
    // True, in case the matcher did not find any according value:
    value.equals("NO MATCH"); 
    

    比较http://www.tutorialspoint.com/java/java_regular_expressions.htmJava Regex Capturing Groups

    然后,您可以检查不同的组,只要有一个组不匹配,但后面的组确实匹配,您的案例中就不再可能有有效的输入(仅通过添加)

    为了使其适用于您的示例,您可以调用一个validate函数,该函数在每个enter事件(例如按键按下事件)上实现上述代码。但这取决于您的UI框架

  2. # 2 楼答案

    第一件事第一

    你的E-Mail Regexwrong

    仅根据地址的外观就很难验证电子邮件。。。大多数时候人们只是做错了。你也是。对不起

    这不是关于正则表达式,而是关于用户体验

    您最好允许用户输入他们想要的任何内容,并告诉他们他们的电子邮件是否可能被错误键入,而不是首先阻止用户输入

    至于输入时的验证

    如果您仍然希望使用正则表达式运行,只需将后面的部分设置为可选部分,这样不完整的部分就可以与正则表达式匹配

    https://regex101.com/r/zO6nM7/1

    /^[_a-z0-9-\+.-]+(\.[_a-z0-9-]+)*@?([a-z0-9+\-]+\.)*[a-z0-9+\-]*$/i
    
  3. # 3 楼答案

    您可以在这里使用?。这是使前面的符号可选的符号。你的例子很糟糕,因为电子邮件不应该通过正则表达式验证,所以我将使用其他方法

    假设您想要匹配以下内容

    4 alphabets then 2 digits then 4 alphabets

    所以你可以使用正则表达式,比如

    (?:\w{0,4})?(?:\d{0,2})?(?:\w{0,4})?
    

    下面的组称为非捕获组。您可以使用捕获组,但由于性能原因,您不应该使用,因为您不需要捕获的内容

    (?: something)

    外植体

    基本上,我所做的是去决定我最初的规范中的字符串是什么

    4 alphabets ..

    然后我把每一部分分成一个单独的正则表达式,让它成为可选的,这样我的正则表达式基本上就是

    • 可选地匹配0到4个字符,并进一步匹配
    • 可选地匹配0到2个数字,并进一步匹配
    • 可选地匹配0到4个字符,并进一步匹配

    以上不是充分的证据。它可能会给出误报,但如果问题是附加是否可能给出正确的结果,并且您不需要绝对值,那么您可以使用这种方法

    为了获得更好的结果,即绝对正确的结果,您可以使用lookbehinds。但请注意,这可能会变得复杂。但是,如果你正在寻找一些简单的东西,这是可行的