使用正则表达式匹配特定字符,如果它在两个数字之间
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".
对于某些数据处理,我需要将一个字符串拆分为多个项目。 输入字符串的示例是:
'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".