2013-02-26 3 views
0

В моем проекте (PHP), я получил некоторые regexs (PCRE), как это:улучшить регулярное выражение PCRE PHP

preg_match('/[\s^0-9]{0,1}([0-9]{2})[\s^0-9]{0,1}/',$chanson['nom'],$resultPreg1)

Это регулярное выражение поймать два числа, которые могут быть разделены или не одним пробелом, и не может быть ограничено числом. То, что я хочу сделать, это то, что в начале есть или пробел (и не число), или пробел (и не число) в конце. Но он должен иметь по крайней мере один разделитель.

Как это сделать?

+1

Примеры будут работать очень хорошо в этой ситуации ;-) –

+0

Я согласен с Джеком. Этот вопрос будет намного яснее, если вы предоставите некоторые примеры строк. Это придаст вашему вопросу контекст и устранит любые затяжные сомнения относительно того, какие случайные случаи могут выглядеть. – mickmackusa

ответ

1

Вам просто нужно разделить его и проверить каждый случай:

/\s\d{2}\D|\D\d{2}\s/ 

Это будет соответствовать пространство, две цифры, и любой не-цифровой символ или нецифры характер, две цифры и пространство.

Примечание: \d - это цифра, эквивалентная [0-9]. \D - это не цифра, эквивалентная [^0-9].

Вышеописанное регулярное выражение требует наличия по крайней мере одной нецифровой информации с каждой стороны номеров. Кроме того, если у вас был шаблон, такой как .11 22., он не соответствовал бы двум номерам, потому что пространство было бы съедено первым матчем. Если это проблема, вы можете использовать внешний вид обходные:

/\s\d{2}(?!\d)|(?<!\d)\d{2}\s/ 

Это соответствует пробел, затем две цифры не следует другой цифрой или две цифры не предшествуют цифры, а затем пробел.

(?!...) отрицательный внешний вид. Это означает, что «матч не может быть после этого».

(?<!...) отрицательный внешний вид, что означает «совпадение не может предшествовать этому».

+0

ОК спасибо. Я didn'nt знал \ d так полезный ... поэтому мы можем использовать | как или и & as и? – vekah

+0

Если строка достигнута до конца на последней цифре. Было ли это регулярное выражение? – vekah

+1

Да, '|' означает * или *. Если вам нужно, чтобы он применим только к части шаблона, поместите его в группу: '/ (?: spl | dr) в /' соответствует «splat» или «drat». Нет ничего, что означает * и *, потому что по умолчанию шаблон должен соответствовать всем. – 2013-02-26 11:40:03

0

Вы не можете смешивать отрицательные и положительные классы символов в одном наборе квадратных скобок. «Пробел» ИЛИ «не номер» можно написать \s|[^0-9]. Но пробел не номер, поэтому нет необходимости вставлять его специально, достаточно всего [^0-9]. Ваш синтаксис для «нуля» или «один» из {0,1} технически корректен, но для одного и того же объекта существует гораздо более сжатый синтаксис: ?.

preg_match('/[^0-9]?([0-9]{2})[^0-9]?/',$chanson['nom'],$resultPreg1) 

Вы можете почти использовать разрывы слов вокруг вашего номера, чтобы получить то, что вы ищете, за исключением не найдет числа внедренных в письмах, как «abc23def».

preg_match('/\b([0-9]{2})\b/',$chanson['nom'],$resultPreg1) 
Смежные вопросы