2016-08-31 4 views
0

Для некоторой обработки данных мне нужно разбить строку на несколько элементов. Пример входной строки является:Соответствие определенного символа, если оно находится между двумя цифрами с регулярным выражением

'one, two & three and four-five 123-456' 

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

Я использую PHP и preg_split сделать фактическое разделение, но мне нужен шаблон регулярного выражения, чтобы соответствовать ограничителей за исключением разделителем -, когда он находится между двумя числами (цифрами, но также может быть 123-456). Подавление пробелов вокруг каждого элемента выполняется с помощью trim() в PHP.

Я использую следующий регулярное выражение:

/(and|,|\s|&)|\D(-)\D/ 

Выходной сигнал (после использования preg_split и т.д.) является:

[0] => one 
[1] => two 
[2] => three 
[3] => fou 
[4] => ive 
[5] => 123-456 

Рабочим является правильным, но он также занимает последний и первый буква окружающего текста для разделителя -. Элемент 123-456 верен, так как он не должен совпадать (и разбиваться на preg_split) на -, когда он сразу же окружен цифрой.

Ожидаемый результат:

[0] => one 
[1] => two 
[2] => three 
[3] => four 
[4] => five 
[5] => 123-456 

Любая помощь приветствуется, если какая-либо информация отсутствует, дайте мне знать, и я буду обновлять свой вопрос.

ответ

2

То, что вы хотите использовать lookahead and lookbehind (более известный, как lookaround):

/and|,|\s|&|(?<!\d)-(?!\d)/ 

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

В этом случае (?<!\d) является отрицательным просмотра назад - он будет смотреть назад, чтобы увидеть, если непосредственно предшествующая строка не соответствуют шаблону. Если это так, он сообщает о совпадении как неудачном и движется дальше. Аналогично, (?!\d) - отрицательный взгляд - он делает то же самое, но в обратном направлении. Поскольку - зажат между ними, эффект «соответствует только -, если он не имеет числовых символов с обеих сторон».

+0

спасибо. Это решило мой вопрос. Я приму ваш ответ через несколько минут, когда это позволит мне. Из интереса, в чем причина различия в обозначениях для первой части? Он работает точно так же, как и мой, но делает ли он что-то еще? –

+1

Я добавил краткое объяснение. –

+2

Последняя сторона чередования должна быть '(? revo