2016-08-31 65 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

相关问题