对于某些数据处理,我需要将字符串拆分为多个项目。 输入字符串的示例是:
'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];
任何帮助都表示赞赏,如果缺少任何信息,请告诉我,我会更新我的问题。
答案 0 :(得分:2)
您要使用的是lookahead and lookbehind(通常称为外观):
/and|,|\s|&|(?<!\d)-(?!\d)/
这将使名称意味着什么 - 环顾四周检查指定的模式是否匹配,没有匹配。在这种情况下,它只会匹配两侧未被数字字符(-
s)包围的\d
,但匹配只会是-
本身。
在这种情况下,(?<!\d)
是一个负面的背后隐藏 - 它会向后看,看看前面的字符串是否与模式匹配。如果是,则将匹配报告为失败并继续。同样地,(?!\d)
是负向前瞻 - 它完全相同,但方向相反。由于-
夹在它们之间,因此如果两边都没有数字字符,则效果为“仅匹配-
”。