匹配具有正则表达式

时间:2016-08-31 20:10:53

标签: php regex preg-split

对于某些数据处理,我需要将字符串拆分为多个项目。 输入字符串的示例是:

'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 分开)。

预期输出为:

localNotification.timeZone = [NSTimeZone systemTimeZone];

任何帮助都表示赞赏,如果缺少任何信息,请告诉我,我会更新我的问题。

1 个答案:

答案 0 :(得分:2)

您要使用的是lookahead and lookbehind(通常称为外观):

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

这将使名称意味着什么 - 环顾四周检查指定的模式是否匹配,没有匹配。在这种情况下,它只会匹配两侧未被数字字符(- s)包围的\d,但匹配只会是-本身。

在这种情况下,(?<!\d)是一个负面的背后隐藏 - 它会向后看,看看前面的字符串是否与模式匹配。如果是,则将匹配报告为失败并继续。同样地,(?!\d)负向前瞻 - 它完全相同,但方向相反。由于-夹在它们之间,因此如果两边都没有数字字符,则效果为“仅匹配-”。