使用正则表达式匹配特定字符,如果它在两个数字之间

Matching specific character if it is between two digits with regex

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

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

现在,我需要将这个字符串分成项目,其中可能的分隔符是 ,&</code> (space), <code>and-。但是,这就是我卡住的地方,当它在两个数字之间时,它不应该在 - 上拆分。

我正在使用 PHP 和 preg_split 进行实际拆分,但我需要一个正则表达式模式来匹配分隔符,但分隔符 - 位于两个数字之间(数字,但也可以是 123-456)。在 PHP.

中使用 trim() 抑制每个项目周围的 spaces

我正在使用以下正则表达式模式:

/(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

感谢任何帮助,如果缺少任何信息请告诉我,我会更新我的问题。

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

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

顾名思义,这将执行的操作 - 环顾四周以检查指定的模式是否匹配,不匹配。在这种情况下,它只会匹配两边都没有被数字字符(\d)包围的 -,但是 匹配 会只是 - 本身。

在这种情况下,(?<!\d) 是一个 负向后视 - 它会向后看,看看紧接在前的字符串 是否 [=30] =] 匹配模式。如果是,它将报告匹配失败并继续。同样,(?!\d) 是一个 负前瞻 - 它做的事情完全相同,但方向相反。因为中间夹着-所以效果是"match only a - if it does not have numeric characters on both sides".