Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用正则表达式匹配以4位数字结尾的所有子字符串_Php_Regex_String_Preg Split - Fatal编程技术网

Php 使用正则表达式匹配以4位数字结尾的所有子字符串

Php 使用正则表达式匹配以4位数字结尾的所有子字符串,php,regex,string,preg-split,Php,Regex,String,Preg Split,我试图在php中拆分一个字符串,如下所示: ABCDE1234ABCD1234ABCDEF1234 ABCDE1234 ABCD1234 ABCDEF1234 $pattern = "#[0-9]{4}$#"; preg_split($pattern, $stringToSplit); 放入一个字符串数组,在本例中,该字符串如下所示: ABCDE1234ABCD1234ABCDEF1234 ABCDE1234 ABCD1234 ABCDEF1234 $pattern = "#[0-9]

我试图在php中拆分一个字符串,如下所示:

ABCDE1234ABCD1234ABCDEF1234
ABCDE1234
ABCD1234
ABCDEF1234
$pattern = "#[0-9]{4}$#";
preg_split($pattern, $stringToSplit);
放入一个字符串数组,在本例中,该字符串如下所示:

ABCDE1234ABCD1234ABCDEF1234
ABCDE1234
ABCD1234
ABCDEF1234
$pattern = "#[0-9]{4}$#";
preg_split($pattern, $stringToSplit);
因此,模式是“一个未定义的字母数,然后是4位数字,然后是一个未定义的字母数和4位数字等。”

我尝试使用preg_split拆分字符串,如下所示:

ABCDE1234ABCD1234ABCDEF1234
ABCDE1234
ABCD1234
ABCDEF1234
$pattern = "#[0-9]{4}$#";
preg_split($pattern, $stringToSplit);
它返回一个数组,该数组在第一个元素中包含完整的字符串(未拆分)

我猜这里的问题是我的正则表达式,因为我不完全理解如何使用它们,我不确定我是否正确使用了它

那么什么是正确的正则表达式呢?

PHP使用了样式为的正则表达式,可以让您进行向后查看。你可以用这个来看看你身后是否有4位数字。将其与前瞻相结合,看看你前面是否有一封信,你会得到以下结果:

(?<=\d{4})(?=[a-z])

(?使用对比原则:

\D+\d{4}
# requires at least one non digit
# followed by exactly four digits
看。
PHP
中,这将是:

var_dump(preg_split('/(?<=\d{4})(?=[a-z])/i', 'ABCDE1234ABCD1234ABCDEF1234'));
<?php
$string = 'ABCDE1234ABCD1234ABCDEF1234';
$regex = '~\D+\d{4}~';
preg_match_all($regex, $string, $matches);
?>


请参阅。

您不想要
preg\u split
,您想要
preg\u match\u all

$str = 'ABCDE1234ABCD1234ABCDEF1234';
preg_match_all('/[a-z]+[0-9]{4}/i', $str, $matches);
var_dump($matches);
输出:

array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(9) "ABCDE1234"
    [1]=>
    string(8) "ABCD1234"
    [2]=>
    string(10) "ABCDEF1234"
  }
}
array (
  0 => 'ABCDE1234',
  1 => 'ABCD1234',
  2 => 'ABCDEF1234',
)

我不擅长正则表达式,所以这条路很少有人走过:

<?php
$s = 'ABCDE1234ABCD1234ABCDEF1234';
$nums = range(0,9);

$num_hit = 0;
$i = 0;
$arr = array();

foreach(str_split($s) as $v)
{
    if(isset($nums[$v]))
    {
        ++$num_hit;
    }

    if(!isset($arr[$i]))
    {
        $arr[$i] = '';
    }

    $arr[$i].= $v;

    if($num_hit === 4)
    {
        ++$i;
        $num_hit = 0;
    }
}

print_r($arr);

首先,为什么尝试的模式没有提供所需的输出?因为
$
锚告诉函数使用最后四个数字作为“分隔符”(将字符串分割为单独部分时应该使用的字符)来分解字符串

您的结果:

简单地说,要修正模式,您必须:

  • 爆炸和爆炸时不消耗任何角色
  • 确保没有生成空元素
  • 我的片段在这篇文章的底部


    第二,关于使用什么正则表达式函数(或者即使正则表达式是一个更受欢迎的工具)似乎存在一些争论

    • 我的立场是,使用非正则表达式方法将需要一个冗长的行块,如果不比正则表达式模式更难阅读的话,这将是同样的。使用正则表达式可以让您在一行中生成结果,而不是以难看的方式。因此,让我们为这项任务处理迭代的条件集
    • 现在关键的问题是,该任务是否只是从一致有效的字符串(案例“a”)中“提取”数据,或者是否是从字符串(案例“B”)中“验证和提取”数据,因为不能相信输入是一致/正确的

      • 在案例A中,您不必关心在输出中生成有效的元素,因此
        preg\u split()
        preg\u match\u all()
        都是很好的候选者
      • 在案例B中,
        preg_split()
        是不可取的,因为它只查找子字符串的定界——它仍然不知道字符串中的所有其他字符
    • 假设这个任务是案例A,那么关于调用更好的函数的决定仍然悬而未决。好吧,两个函数都生成一个数组,但是
      preg\u match\u all()
      创建一个多维数组,而您需要一个平面数组(如
      preg\u split()
      提供)。这意味着您需要将新变量添加到全局作用域(
      $matches
      )并将
      [0]
      附加到数组以访问所需的完整字符串匹配。对于不了解正则表达式模式的人,这可能接近使用“”的错误做法

    对我来说,我努力做到直接和准确,然后是效率,然后是简洁和清晰。因为在执行如此小的操作时,您不太可能注意到任何性能下降,所以效率并不是非常重要。我只想做一些比较,以突出一次操作的成本仅利用环顾四周的模式或错过机会贪婪地匹配可预测角色的模式


    • /(?你确定不能在一个数字后面跟一个字母后拆分字符串吗?从你的例子来看,似乎你完全可以做到。为什么你不能简单地找到每个有数字字母对的地方,这会给你断字符串的位置呢?我没有意识到这一点……它是这样工作的!在“PHP”正则表达式中,您似乎不需要显式检查4位数字,只需检查后跟字母的数字即可。例如,
      /(?@w3dk在本例中是的,我只是尽可能喜欢我的正则表达式:)此答案缺少解释。
      $nums
      查找数组可以通过实现
      ctype\u digit来避免()
      而不是
      isset()
      。此答案缺少解释。