0

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

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

1
12
123
1234

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

我试过了

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

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

4

3 回答 3

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

这个演示。


但是,您也应该使用没有正则表达式的简单解决方案>>

代码:

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

输出:

1
12
123
1234

在此处检查此代码。

于 2012-09-29T00:23:59.023 回答
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 库完全能够做到这一点。但即使是我也不会那样做。

至于任意分组,这变得更加棘手,需要递归模式和更严重的魔法。除了某种扩展性证明类型的编程竞赛,我不会这样做,而不是你希望维护的真实代码,而不是被枪杀。

于 2012-09-28T23:16:36.527 回答
-1

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

这就是为什么发明了循环。for我敢肯定,用一个简单的循环来煮东西是很容易的。

例子:

$str = "1234";
for ($i = 0; $i < strlen($str); $i++) {
    echo substr($str, 0, $i+1) . "\n";
}
于 2012-09-28T22:52:37.763 回答