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