2014-02-07 1 views
1

мне нужно регулярное выражение в Java, которая проверяет такие правила:Как создать регулярное выражение, указывающее, что строка должна иметь некоторые специальные символы в любой позиции?

  1. одна заглавная буква в любом положении
  2. один из [._-,] в любом положении
  3. по крайней мере, одна цифра в любом положении

Не могли бы вы объяснить, как создать такое регулярное выражение?

Мое регулярное выражение с помощью @CodingDuckling стало, как:

(.*[A-Z -_.,\\d].*[A-Z -_.,\\d].*[A-Z -_.,\\d].*){5,} 

Но это не работает для строки laVa-1234.

Я не знаю, как выразить at any position. Я понимаю, что это регулярное выражение неверно.

Спасибо!

+0

Почему вы группируете его и говорите, что он должен повторять 5 или более раз? Кроме того, будьте осторожны при установке «-» внутри «[]», вам нужно избегать этого, если вы не поместите его в начале или в конце внутри скобок. – CodingDuckling

+2

Вам нужно использовать положительный прогноз. –

ответ

2

Это может быть решена с помощью положительный предпросмотр:

/(?=.*[A-Z]+)(?=.*[0-9]+)(?=.*[.,_-]+).*/ 

Это регулярное выражение делает «предпросмотр», по крайней мере, одной заглавной буквы, по меньшей мере, один номер и по меньшей мере один из [, _-.] предваряется ничего и затем ничего.

См: http://regex101.com/r/eN9sX4

EDIT:

Обновлено в соответствии с Борисом-на-Spiders комментарий:

/(?=.*?[A-Z]+)(?=.*?[0-9]+)(?=.*?[.,_-]+).*/ 

опережения использует ленивые кванторы для оптимизации времени выполнения ...

http://regex101.com/r/aF0eK4

+0

Это идеальное решение, я забыл использовать lookahead :) – CodingDuckling

+2

Возможно, вам лучше использовать ленивый '. *' В lookaheads, то есть '. *?', иначе они будут потреблять всю строку каждый раз, а затем возвращаться. В противном случае отлично. –

+0

Хороший момент, спасибо, обновил ответ соответственно. – jonas

2

Вы можете сделать:

String input = "aaaAbbbb_ccccc1"; 
input.matches(".*[A-Z0-9 ._,-].*"); 

Input это только пример, конечно.

Это должно сработать.


Полный Java-код:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class MainRegex { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     String input = "aaaAbbbb_ccccc1"; 
     System.out.println(input.matches(".*[A-Z0-9 ._,-].*")); 
    } 

} 

Объяснение картины на Regex101: http://regex101.com/r/fZ3mK0

+1

Это подтверждает любое из трех условий, но только по одному, я имею в виду, если хотя бы одно из этих условий истинно, оно вернет true. Должен ли он одновременно выполнять 3 проверки? (например, по крайней мере один из них?) – CodingDuckling

+0

Это не так. Ваше регулярное выражение будет соответствовать, например, строке '1'. –

+0

@CodingDuckling, вы правы. Он должен соответствовать хотя бы одной заглавной и одной цифре, а другой - [-_,]. –

0

Я не знаю, если есть лучший способ, но мой код пытается соответствовать одному из 6 возможных перестановок ... и он работает для всех тестовых случаев, которые я пробовал^_^

String input = "laVa-1234"; 
String pattern= "(.*[A-Z].*[ ._,-].*[0-9].*)||(.*[A-Z].*[0-9].*[ ._,-].*)" 
     + "||(.*[ ._,-].*[A-Z].*[0-9].*)||(.*[ ._,-].*[0-9].*[A-Z].*)" 
     + "||(.*[0-9].*[ ._,-].*[A-Z].*)||(.*[0-9].*[A-Z].*[ ._,-].*)"; 
System.out.println(input.matches(pattern)); 
Смежные вопросы