Ваше условное выражение не работает даже в PHP.Взгляд вперед - (?=-)
- успешен, если следующий символ - дефис, но он не потребляет дефис.Затем [a-z]+
пытается найти совпадение в той же позиции и терпит неудачу, потому что следующий символ по-прежнему -
.Вам нужно будет снова сопоставить дефис - -[a-z]+
- но, как сказали другие, вам все равно не следует использовать условные выражения.
Условные выражения соблазнительны;они кажутся как будто они должны быть очень полезными, но на практике они редко бывают полезными.Они заманивают нас, отражая то, как мы естественным образом думаем об определенных проблемах: «Я хочу сопоставить несколько букв, а если следующий за ними символ - дефис, я хочу сопоставить его и еще несколько букв».
Вы избавите себя от многих хлопот, если научитесь думать немного больше как регулярное выражение: «Я хочу сопоставить кусок букв, за которыми, возможно, следуют дефис и еще несколько букв».Регулярное выражение практически записывается само по себе:
/[a-z]+(?:-[a-z]+)?/
(\.[1-9][0-9]*
часть вашего регулярного выражения была в порядке; я оставил это, чтобы сосредоточиться на условном аспекте.)
РЕДАКТИРОВАТЬ: Чтобы ответить на вопрос в комментарии, да, ваше регулярное выражение совпадает со строками обеих форм: abc.124
и abc-abc.123
.Но посмотрите, какая именно часть строки соответствует:
Array
(
[0] => Array
(
[0] => abc.124
[1] => abc.123
)
)
В результате получается, что первое [a-z]+
изначально совпадает с первым abc
в abc-abc.123
.Затем предвидение сопоставляет -
, не потребляя его, а вторая [a-z]+
пытается сопоставить дефис и терпит неудачу, как я говорил ранее.
Не найдя совпадения в этой позиции, запускается механизм регулярных выраженийнатыкаясь вперед по одному персонажу за раз и пытаясь снова.Когда он достигает второго abc
, первый [a-z]+
соответствует ему и передает следующую часть регулярного выражения - условное.
Следующим символом во входной строке является .
, поэтому просмотр не выполняется.Условие не должно совпадать ни с чем, потому что вы не указали подшаблон для предложения else
.Таким образом, условное соответствие ничему не соответствует, и управление переходит к следующей части регулярного выражения, \.[1-9][0-9]*
, которая завершается успешно.