0

我想在“33”、“A”、“5”部分拆分字符串:“33A/5”。

在 php 中是否有可能将一些正则表达式写为:"/^(\d+) (\D) \/? (\d+)/",括号中的表达式( exp )成为单独的部分?

4

2 回答 2

3

你可以preg_match这样使用:

preg_match("/^(\d+) (\D+) \/? (\d+)/x", $text, $match);

$match将是一个具有单独匹配项的数组。

修饰符是忽略正则表达式中的x空格;否则,请勿放置空格:

preg_match("/^(\d+)(\D+)\/?(\d+)/", $text, $match);
于 2013-10-07T11:48:59.803 回答
1

这也可以使用单个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]+: 任何不是/数字或数字的字符的贪婪匹配 -> 在组中
  • )\/?: 关闭组,匹配可选 /,在组之外 => 所以它不匹配为捕获的分隔符的一部分
于 2013-10-07T12:22:54.700 回答