【问题标题】:Regular expression pattern to match adjacent characters匹配相邻字符的正则表达式模式
【发布时间】:2012-09-28 22:28:10
【问题描述】:

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

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

1
12
123
1234

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

我试过了

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

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

【问题讨论】:

  • 这是发明循环的目的,而不是正则表达式。为什么需要正则表达式?你还需要做更多吗?
  • 我很好奇这是否可以仅使用正则表达式来完成。
  • 我想这已经足够了:)。可以肯定的是,它不能通过单个正则表达式来完成。反正也不是没完没了。 /((((.).).).)/,然后以错误的顺序打印组,从组 4 开始。
  • @OmarJackman“可以”!=“应该”。是的,它可以。
  • 对所有事情都使用正则表达式的痴迷是什么?

标签: php regex preg-match-all


【解决方案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

【讨论】:

  • 不知道为什么这被赞成。这是一个 PHP 问题,这里的 Perl 代码没有用。 PHP没有“反向”。
  • @mega:是的,我是反对者,我已经提供了一个完全可以接受的解释。这个答案没有用。 PHP 没有您在此处使用的功能。
  • @mega:这与您在 Perl 中使用“反向”所做的完全不同。
【解决方案2】:

有可能吗?是的。合理吗?应该不会吧。

这是一个 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 库完全能够做到这一点。但即使是我也不会那样做。

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

【讨论】:

    【解决方案3】:

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

    这就是发明循环的原因。我敢肯定,用一个简单的for 循环来做一些事情是很容易的。

    例子:

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

    【讨论】:

    • 每个人的合理程度都是他自己的,但我同意为此使用模式匹配并不自然​​。
    • @tchrist:有些事情是全球公认的不合理的。 HTML 也可以用正则表达式解析。并不意味着这是个好主意。
    • 很确定,我将是地球上最后一个你需要谈论的人 regex-based approaches to parsing HTML
    • @Ωmega:如果我的代码不包含语法错误,请不要编辑它。另外,不要改变我回答的意思。
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2021-10-24
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多