2014-01-08 2 views
1

Я программно очищаю данные по мере их ввода и вам нужно извлечь информацию о количестве для элемента. Для каждого элемента должно быть пробел между количеством количества и единиц измерения. Иногда он включает десятичную, а иногда и тире (-) бесполезно рядом с информацией о количестве. В тире должно быть либо вставлено между ним и информацией о количестве, либо полностью удалено.regex для вставки пробелов во множестве экземпляров

Регулярное выражение, которое я включил ниже, будет обрабатывать запись Молока, но ни один из остальных.

Примечание: иногда серийный номер в начале строки ($str), поэтому величина единица должна быть включена в preg_replace.

$str = "Chicken 4 lbs."; 

$str = "Cream of Mushroom Soup 10.4oz"; 

$str = "4XY Milk 1gal"; 

$str = "Leaf Spinach -12oz"; 

$str = "5QB Bananas -6.2lb."; 

$str = preg_replace('/(?<=[0-9])(?=[g|g.|oz|oz.|lb|lb.|gal|gal.|mL|mL.|kg|kg.|un|un.|tab|tab.])/',' ', $str); 

EDIT: в тестировании ответы (! Все это блестящие, кстати), я придумал с дополнительным измерением: IF тире (-) непосредственно предшествует алфавитно-цифровой символ, я НЕ хотите создать пробел после него.

$str = "Route US-66 4 lb"; 
+0

Сократите это до '(? <= [0-9]) (? = (G | oz | lb | gal | mL | kg | un | tab) \.?)' '?' Делает '.' необязательным , – tenub

ответ

3

Я думаю, что вы поняли, как классы персонажей и | работы.

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

(?<=[0-9])(?=(?:g|oz|lb|gal|mL|kg|un|tab)\.?) 

regex101 demo

Это то, что вы ищете?


EDIT:

Для тире, вы могли бы, возможно, добавить этот бит:

(?<=-)(?=[0-9]) 

И объединить его с указанным выше (также извлекая период согласно @Ron в комментариях):

(?<=[0-9])(?=g|oz|lb|gal|mL|kg|un|tab)|(?<=-)(?=[0-9]) 

regex101 demo


EDIT2:

В соответствии с обновлением, чтобы предотвратить добавление пробела перед тире предваряется на алфавитно-цифровой символ:

(?<=[0-9])(?=g|oz|lb|gal|mL|kg|un|tab)|(?<=\B-)(?=[0-9]) 

regex101 demo

+1

Я считаю, что терминал \.? чтобы быть ненужным, что сделало бы неудержимую группу излишней. –

+0

@Jerry ссылка, которую вы мне прислали, действительно полезна, но мне все еще нужно иметь дело с тире. Мне нужно, чтобы он был разделен пробелом или удален. Как вы думаете, как наиболее эффективный способ сделать это? Благодаря! –

+0

@RonRosenfeld Очень верно. Я об этом не думал, ох! – Jerry

0

Try,

(?<=[0-9])(?=(g|oz|lb|gal|mL|kg|un|tab)\.?) 

enter image description here

1

Правильное регулярное выражение:

(?<= -)(?=\d+)|(?<=\d)(?=[a-z]) 

Ваш PHP:

$str = "Leaf Spinach -12oz"; 
echo preg_replace('/(?<= -)(?=\d+)|(?<=\d)(?=[a-z])/', ' ', $str); 

Выход:

Leaf Spinach - 12 oz 

Live demo

+0

Не работает: 5QB Bananas -6.2 lb. (обратите внимание на пробел после тире, пробел после номера) –

+0

@RonRosenfeld обновлен. – revo

+1

Поскольку у вас теперь все включено, я удалю свой ответ. Хотя я бы предположил, что ваше можно было бы сделать более надежным, добавив конкретные единицы в список. –

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