2010-06-04 3 views
4

Я довольно новичок в регулярных выражениях, и чем больше я их использую, тем больше они мне нравятся. Я работаю на регулярное выражение, которое должно соответствовать следующим условиям:Регулярное выражение Postive Lookahead substring

  1. должно начинаться с символа Альфа
  2. Из следующих трех персонажей, по крайней мере, один должен быть символ Альфа.
  3. Все, что после первых четырех символов является автоматическим совпадением.

Я в настоящее время имеют следующее регулярное выражение: ^[a-zA-Z](?=.*[a-zA-Z]).{1}.*$

Проблема Я бегу в том, что мой положительный предпросмотр (?=.*[a-zA-Z]).{1} не ограничивается на следующие три символа после буквенного символа.

Мне кажется, что здесь отсутствует концепция. Что мне не хватает в этом выражении?

Спасибо всем.

+0

На 2: только один и ровно один или, по крайней мере, один? – polygenelubricants

+0

извините за это. По крайней мере, один должен быть альфа-символом. – user90279

ответ

3

.* в вашем lookahead это делает. Вы должны ограничить диапазон здесь, как

^[a-zA-Z](?=.{0,2}[a-zA-Z]).{1}.*$ 

Edit: Если вы хотите, чтобы убедиться, что есть не менее 4 символов в строке, вы можете использовать другой предпросмотр вроде этого:

^[a-zA-Z](?=.{3})(?=.{0,2}[a-zA-Z]).{1}.*$ 
+0

Это также будет соответствовать 'aa' –

+0

@Jan: OP не упоминает, что ему требуется не менее четырех символов, но я обновил свой ответ, чтобы дать эту опцию. – Jens

+0

Как '. {1}' отличается от '.'? ;-) (Для записи второе выражение легче записать как '^ [a-zA-Z] (? =. {0,2} [a-zA-Z]). {3}. *'. + 1 от меня, элегантный подход.) – Tomalak

1

Возможно, вам придется сделать обходной путь. Что-то вроде:

^[a-z](?=([a-z]..|.[a-z].|..[a-z])).{3}.* 
  • Первый символ [аз]
  • Положительный опережения, либо первый, либо второй, либо третий символ является аз ([a-z]..|.[a-z].|..[a-z])
  • Прочее
3

Что вы хотите посмотреть? Почему бы просто не использовать

^[a-zA-Z](..[a-zA-Z]|.[a-zA-Z].|[a-zA-Z]..) 

и быть счастливым?

+0

Хорошая точка. Использование lookahead и (особенно) lookbehind, когда это не необходимо, может повредить производительность. +1 для упрощения. – Robusto

+0

Идеально разумное решение. Полагаю, я переусердствовал. Просто для удовольствия, что, если я сказал, что хотя бы один из следующих 30 символов должен быть альфа. Есть ли способ инкапсулировать эту идею в более простое утверждение? – user90279

+0

@Robusto: Не в этом случае, по крайней мере, не за «академическими» различиями. – Tomalak

0

Изменения * в вашем опережающем просмотре, чтобы ? получить m/^[a-zA-Z](?=.?[a-zA-Z]).{1}.*$

Если я понять ваши критерии, которые исправляют это из-за изменения в алчности.

Они правильно подобранное:

a2a3-match 
2aaa-no match 
Aaaa-match 
a333-no match 
+0

Будет также соответствовать 'aa' –

Смежные вопросы