2014-01-08 72 views
1

我正在編程清理數據,因爲它被輸入並需要提取項目的數量信息。對於每件商品,數量和數量單位之間需要有一個空格。有時它包含一個小數,有時一個破折號( - )在數量信息旁邊沒有幫助。破折號應該在它和數量信息之間插入一個空格或者完全刪除。正則表達式在各種實例中插入空間

我在下面包含的正則表達式將處理Milk條目,但是其他條目都不會。

注意:有時序列號是在字符串($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); 

編輯:在測試你的答案(!所有這一切的輝煌,順便說一句),我想出了一個額外的維度:如破折號( - )立即被字母數字字符之前,我做不想在它後面創建空間。

$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

這就是你想要的?


編輯

短跑,你也許可以添加此位:

(?<=-)(?=[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

嘗試,

(?<=[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香蕉-6.2磅(注意破折號後沒有空格;號碼後有空格) –

+0

@RonRosenfeld更新。 – revo

+1

由於你現在似乎全包,我會刪除我的答案。雖然我會建議你可以通過將特定單位添加到前瞻來使其更加健壯。 –