我正在寻找可以匹配 php.ini 中字符串中相邻字符的正则表达式模式。
例如,如果我有字符串“1234”,我希望它匹配并返回
1
12
123
1234
这可以用 php 中的正则表达式来实现吗?
我试过了
$testString = '1234';
preg_match_all('/.+/', $testString, $matches);
但这只会返回整个字符串。
我正在寻找可以匹配 php.ini 中字符串中相邻字符的正则表达式模式。
例如,如果我有字符串“1234”,我希望它匹配并返回
1
12
123
1234
这可以用 php 中的正则表达式来实现吗?
我试过了
$testString = '1234';
preg_match_all('/.+/', $testString, $matches);
但这只会返回整个字符串。
使用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
在此处检查此代码。
是否可以?是的。合理吗?可能不是。
这是 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 库完全能够做到这一点。但即使是我也不会那样做。
至于任意分组,这变得更加棘手,需要递归模式和更严重的魔法。除了某种扩展性证明类型的编程竞赛,我不会这样做,而不是你希望维护的真实代码,而不是被枪杀。
不,这不能(合理地)用正则表达式完成。
这就是为什么发明了循环。for
我敢肯定,用一个简单的循环来煮东西是很容易的。
例子:
$str = "1234";
for ($i = 0; $i < strlen($str); $i++) {
echo substr($str, 0, $i+1) . "\n";
}