需要regex从一个字符串中提取两个子字符串


need regex to extract two substrings from one string

我有一个类似于tvm11551.iso的字符串,我正在尝试解析它。在这个字符串中,这些粗体数字各不相同:tvm1151.iso(请忽略此处的空格)。我用PHP编写了以下程序,可以从字符串中提取这两个数字:

$a = "tvm11551.iso";
if(preg_match('/^tvm'd{5}'.iso/',$a)){
    $b = preg_match('/tvm('d'd)'d'd'd'.iso/' , $a);
    $c = preg_match('/tvm'd'd'd('d'd)'.iso/' , $a);
    echo "B: " . $b . "<br>";
    echo "C: " . $c;
}

然而,我得到的输出是:

B: 1
C: 1

如何修复RegEx以获得预期的输出?

您看到的输出1preg_match()在成功匹配时返回的匹配数,而不是其内容。由于每个测试只有一个()捕获组,因此返回了一个匹配项。您需要将匹配捕获到数组中,作为preg_match():的第三个参数

$a = "tvm11551.iso";
$matches = array();
preg_match('/^tvm('d{2})5('d{2})'.iso$/', $a, $matches);
var_dump($matches);
array(3) {
  [0] =>
  string(12) "tvm11551.iso"
  [1] =>
  string(2) "11"
  [2] =>
  string(2) "51"
}

根据您的模式,在初始匹配之后,我看不出有任何理由使用RegEx。

你只需要这个:

if(preg_match('/^tvm'd{5}'.iso/',$a)){
    $b = substr($a, 3, 5);
    $c = substr($a, 6, 8);

preg_match返回模式匹配的次数(但由于preg_match总是在找到的第一个匹配处停止,因此它总是返回0或1)。如果你想得到匹配的数字,你必须传递一个数组作为pregmatch的第三个参数。请参阅preg_match文档