2016-08-31 63 views
0

對於某些數據處理,我需要將一個字符串拆分爲多個項目。 的輸入字符串的例子是:匹配特定字符,如果它在兩位數之間用正則表達式

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

現在,我需要這個串分離成的物品,在可能情況下定界符是,&(空間),and-。但是,這是我卡住的地方,它不應該分裂在-之間,當它在兩個數字之間。

我使用PHP和preg_split做實際的分裂,但我需要一個正則表達式匹配的分隔符除所述定界符-當它是兩個數字之間(數字,但也可能是123-456)。在PHP中使用trim()完成每個項目周圍的空格。

我使用下面的正則表達式:

/(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(更通常被稱爲環視):

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

這將完成正是顧名思義 - 環顧四周,以檢查是否指定的模式匹配,無匹配它。在這種情況下,它只會匹配沒有被數字字符(\d s)包圍的-,但匹配只會是-本身。

在這種情況下,(?<!\d)負回顧後 - 它會向後看,看前一個字符串匹配的模式。如果確實如此,則報告匹配失敗並繼續。同樣,(?!\d)是一個負面預測 - 它完全相同的事情,但在相反的方向。因爲-夾在它們之間,所以效果是「只匹配-,如果它沒有雙方的數字字符」。

+0

謝謝。這解決了我的問題。我會在幾分鐘內接受你的答案。出於興趣,第一部分的符號有什麼不同?它和我的完全一樣,但是它還有別的用途嗎? –

+1

我加了一個簡單的解釋。 –

+2

最後的交替側應該是'(?<!\ d) - (?!\ d)',否則它不匹配前導和尾部'-' – revo

相關問題