2013-03-01 6 views
1

Я пробовал регулярное выражение, которое принимает 3 цифры в любом порядке и, надеюсь, это сработало. Вот мой пример кода:Как написать Regex, который должен содержать как минимум 3 буквы и 3 цифры в любом порядке?

^(?:\D*\d){3}\D*$ 

Он принимает строки, как это: абв123, a2v1c3, 123agc

Моя проблема теперь, когда я совмещаю код, который принимает по крайней мере 3 буквы и 3 цифры. Я пробовал много сочетаний регулярных выражений, но я не смог достичь правильного регулярного выражения. Кто-нибудь знает, как написать правильное Regex, которое принимает как минимум 3 буквы и 3 цифры в любом порядке? Заранее спасибо.

+4

почему это помечено под C# и JavaScript? – martriay

+0

Если вы хотите 3 цифры и «по крайней мере» 3 буквы в любом порядке, это должно работать '^ [A-Za-z] * (?: \ D [A-Za-z] *) {3,} $' –

+0

можете ли вы привести примеры «ложных»? –

ответ

3

Вы можете использовать комбинаторные lookaheads, чтобы гарантировать, что по крайней мере три из каждого класса выполняется без потребления. Затем используйте все допустимые символы с лимитом.

/(?=.*[a-z].*[a-z].*[a-z].*)(?=.*\d.*\d.*\d.*)[a-z0-9]{6,}/ 

Это некрасиво, но это намного красивее, чем единственная альтернатива, которую я мог бы придумать;

/\d{3}[a-z]{3}|\d{2}[a-z]{3}\d|\d{1}[a-z]{3},\d{2} ... 
+0

Спасибо Взрывные таблетки это работает на моем коде (? =. * [Az]. * [Az]. * [Az]. *) (? =. * \ d. * \ d. * \ d. *) [a-z0-9] {6}} Я протестировал его на http://regexr.com?33v68, и он отлично работает. Большое спасибо всем вам, ребята –

+0

Может быть упрощено до '/ (? = (?:. * [Az]) {3}) (?:. * \ D) {3} /' – nhahtdh

0

Я думаю, что-то вроде этого, вы должны иметь некоторые функции подсчета, которая, если я правильно помню, это не обеспечивается регулярным выражением двигателя (для обычного {min, max} оператора, за исключением).

Что вы могли бы сделать, чтобы иметь 2 регулярные выражения, один для букв и один для номеров (большинство языков программирования обеспечивают isDigit и isLetter функциональные возможности, так что вы можете также использовать их) и имеют какой-то счетчик. Выполнение этого вместо обычного выражения даст более понятный и понятный код.

+0

Согласен, делать это с регулярным выражением - плохой план. –

1

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

"^[A-Za-z]*(?:\d[A-Za-z]*){3,3}$" 

Тест:

List<string> tests = new List<string> 
{ 
    "abc123", 
    "123agc", 
    "1a3a2c", 
    "a2v1c3" 
}; 

if (tests.All(s => Regex.Match(s, @"^[A-Za-z]*(?:\d[A-Za-z]*){3,3}$").Success)) 
{ 
    MessageBox.Show(":)"); 
} 
+0

Для этого требуется, чтобы строка начиналась с буквы, не так ли? –

+0

нет, это будет работать с цифрами в начале. –

+0

. Ах, правда, '*' –

0

Вы можете сделать это с двумя положительными lookaheads:

/(?=(?:.*\d){3})(?=(?:.*[a-z]){3})^[a-z\d]*$/ 

Regex101 Live Example


Разбивка:

Посмотрите, по крайней мере, 3 цифры:

(?=(?:.*\d){3}) 

Посмотрите, по крайней мере, 3-х букв:

(?=(?:.*[a-z]){3}) 

Определить, что допускается между началом и концом:

^[a-z\d]*$/ 
Смежные вопросы