我想在“33”、“A”、“5”部分拆分字符串:“33A/5”。
在 php 中是否有可能将一些正则表达式写为:"/^(\d+) (\D) \/? (\d+)/"
,括号中的表达式( exp )
成为单独的部分?
你可以preg_match
这样使用:
preg_match("/^(\d+) (\D+) \/? (\d+)/x", $text, $match);
$match
将是一个具有单独匹配项的数组。
修饰符是忽略正则表达式中的x
空格;否则,请勿放置空格:
preg_match("/^(\d+)(\D+)\/?(\d+)/", $text, $match);
这也可以使用单个preg_split
调用来完成:
$chunks = preg_split(
'/(\d+|[^\/\d]+)\/?/',
'33A/5',
-1,
PREG_SPLIT_DELIM_CAPTURE |
PREG_SPLIT_NO_EMPTY
);
var_dump($chunks);
转储:
数组(3){ [0]=> 字符串(2)“33” [1]=> 字符串(1)“A” [2]=> 字符串(1)“5” }
这种方法的工作原理与 [as this answer] 大致相同。该表达式匹配除 之外的所有内容/
,有效地将您想要的数据转换为分隔符。因为我们需要分隔符,所以您必须使用PREG_SPLIT_DELIM_CAPTURE
常量。
当然,由于它们是分隔符,它会将字符串拆分到这些子字符串上,并且由于分隔符之间没有任何内容,因此每个拆分点最终都会得到一个空值,就像它一样。这就是为什么我也使用PREG_SPLIT_NO_EMPTY
常量,使用按位运算|
符
表达式本身:
(
: 开始匹配组\d+
匹配一个或多个数字,贪婪 -> 在组中!|
: 或者,如果\d+
无法匹配,请使用:[^\/\d]+
: 任何不是/
数字或数字的字符的贪婪匹配 -> 在组中)\/?
: 关闭组,匹配可选 /
,在组之外 => 所以它不匹配为捕获的分隔符的一部分