PHPの文字列内の隣接する文字と一致する正規表現パターンを探しています。
たとえば、文字列「1234」がある場合、それを一致させて返します
1
12
123
1234
これはphpの正規表現で可能ですか?
私はもう試した
$testString = '1234';
preg_match_all('/.+/', $testString, $matches);
しかし、それは文字列全体を返すだけです。
PHPの文字列内の隣接する文字と一致する正規表現パターンを探しています。
たとえば、文字列「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";
}