php挑战:解析伪正则表达式

时间:2014-03-18 17:59:50

标签: php

我遇到了一个我无法弄清楚的挑战,但对于那些在算法中思考的人来说,这似乎很有趣且相对容易......

如果我的搜索字词有"?"其中的字符,意味着它不应该关心前面的字符是否存在(如正则表达式)。但我希望我的程序打印出所有可能的结果。

一些例子:" tab?le"应该打印出来" table"和"故事"。结果的数量总是2到问号数量的幂。另一个例子:" carn?ati?on"应打印出来:

  • caraton
  • caration
  • carnaton
  • 康乃馨

我正在寻找一个能带有问号的单词的函数,并输出一个包含所有结果的数组......

2 个答案:

答案 0 :(得分:4)

按照“carn?ati?on”的例子:

您可以将单词/字符串拆分为“?”中的数组那么数组中每个字符串的最后一个字符将是可选字符:

[0] => carn
[1] => ati
[2] => on

然后,您可以为第一个数组中的每个元素创建两个单独的可能性(即,使用和不使用最后一个字符),并将这些排列映射到另一个数组。请注意,上述转换应忽略最后一个元素,因为它不适用。我会用它来形成:

[0] => [carn, car]
[1] => [ati, at]
[2] => [on]

然后我会迭代子数组中的每个元素来计算所有不同的组合。

如果您在申请此流程时遇到困难,请发表评论。

答案 1 :(得分:3)

我认为像这样的循环应该有效:

$to_process = array("carn?ati?on");
$results = array();
while($item = array_shift($to_process)) {
    $pos = strpos($item,"?");
    if( $pos === false) {
        $results[] = $item;
    }
    elseif( $pos === 0) {
        throw new Exception("A term (".$item.") cannot begin with ?");
    }
    else {
        $to_process[] = substr($item,0,$pos).substr($item,$pos+1);
        $to_process[] = substr($item,0,$pos-1).substr($item,$pos+1);
    }
}
var_dump($results);