正则表达式模式匹配相邻的字符

时间:2012-09-28 22:28:11

标签: php regex preg-match-all

我正在寻找一个正则表达式模式,可以匹配php中字符串中的相邻字符。

例如,如果我有字符串“1234”,我希望它匹配并返回

1
12
123
1234

这可以用php中的正则表达式吗?

我试过

$testString = '1234';
preg_match_all('/.+/', $testString, $matches);

但这只会返回整个字符串。

3 个答案:

答案 0 :(得分:1)

使用strrev技巧可以>>

代码:

$s = '1234';
preg_match_all('/(?=(.+$)).?/', strrev($s), $m);
foreach(range(sizeof($m[1]), 0) as $i) print strrev($m[1][$i]) . "\n"; 

输出:

1
12
123
1234

请参阅this演示。


但是你也应该使用没有正则表达式>>

的简单解决方案

代码:

$s = '1234';
foreach(range(1, strlen($s)) as $i) print substr($s, 0, $i) . "\n";

输出:

1
12
123
1234

检查此代码here

答案 1 :(得分:0)

有可能吗?是。这合理吗?可能不是。

这是Perl中的一个演示,只是为了展示它可以用您的特定示例完成:

#!/usr/bin/perl -l

my $string = "abcd";

my $pattern = qr{
    ^
    (?=  ( .{1} )  )
    (?=  ( .{2} )  )
    (?=  ( .{3} )  )
    (?=  ( .{4} )  )
}x;

my @captures = ($string =~ $pattern);

print for @captures;

运行时产生此输出:

a
ab
abc
abcd

PHP使用的PCRE库完全能够做到这一点。但即使我这样做也不行。

至于任意分组,这变得更加棘手,需要递归模式甚至更严重的魔法。我不会做任何事情,除了某种类似防扩展的编程比赛,不是你希望保留的真实代码,也不是为了拍摄。

答案 2 :(得分:-1)

不,这不能(合理地)用正则表达式完成。

这就是为什么发明循环的原因。我确信使用简单的for循环烹饪很容易。

示例:

$str = "1234";
for ($i = 0; $i < strlen($str); $i++) {
    echo substr($str, 0, $i+1) . "\n";
}