2016-09-23 6 views
1

Я создал регулярное выражение, чтобы проверить, есть ли у администратора адрес электронной почты администратор, прошивка, службы &. Если я помещаю'ad 'вместо' admin 'в адрес электронной почты, тогда также он возвращает true, что неверно в соответствии с требованием.Regex не соответствует соответствующим значениям

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

static String email = "[email protected].com"; 
static String email1 = "[email protected]"; 
static String email2 = "[email protected]"; 
public static boolean validate(final String hex) { 
     pattern = Pattern.compile(EMAIL_PATTERN_New); 
     matcher = pattern.matcher(hex); 
     return matcher.matches(); 
    } 
System.out.println(validate(email));  //true 
System.out.println(validate(email1));  //true but it should be false 
System.out.println(validate(email2)); //true but it should be false 

такой же с другим адресом электронной почты прошивки, услуг, ремонта.

+2

Заменить '[админ | прошивки | ремонт | обслуживание] +' 'с (админ | прошивки | ремонт | обслуживание)' –

+0

@ WiktorStribiżew статическую строку EMAIL2 = «[email protected] .com "; возвращает true, даже если я заменил + на - как было предложено. Скорее это должно быть ложным. – Harleen

+0

[Посмотрите здесь] (https://regex101.com/r/iZ6uT2/3). Он не должен соответствовать регулярному выражению. И [это демонстрация Java] (https://ideone.com/MbbE1A) –

ответ

1

Необходимо заменить [admin|firmware|repair|service]+ на (admin|firmware|repair|service).

this regex demo См

[admin|firmware|repair|service]+ комбинационной класс символов отдельные символы, a, d и т.д. один или несколько раз (из-за +). Таким образом, он будет соответствовать ad, add, fir и т.д.

(admin|firmware|repair|service) является последовательность группировки конструкцию, соответствие либо admin или firmware и т.д.

Обратите внимание, что вы можете сократить регулярное выражение в Java с помощью замена [_a-zA-Z0-9] с \w:

private static final String EMAIL_PATTERN_New = "^[\\w+-]+(?:\\.[\\w-]+)*@(?:admin|firmware|repair|service)(?:\\.[A-Za-z0-9]+)*\\.[A-Za-z]{2,}$"; 

и вы можете даже отказаться от ^ и $, так как вы используете регулярное выражение с методом matches().

Java demo from IDEONE:

import java.util.*; 
import java.util.regex.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    private static final String EMAIL_PATTERN_New = 
      "^[\\w+-]+(?:\\.[\\w-]+)*@(?:admin|firmware|repair|service)(?:\\.[A-Za-z0-9]+)*\\.[A-Za-z]{2,}$"; 

    public static void main (String[] args) throws java.lang.Exception 
    { 
     String email = "[email protected]"; 
     String email1 = "[email protected]"; 
     String email2 = "[email protected]"; 

     System.out.println(email.matches(EMAIL_PATTERN_New));  // true 
     System.out.println(email1.matches(EMAIL_PATTERN_New)); // false 
     System.out.println(email2.matches(EMAIL_PATTERN_New)); // false 
    } 
} 
Смежные вопросы