正则表达式检查字符是否匹配字符串

时间:2011-12-06 22:10:32

标签: php regex

我有一些包含字符和字符串列表的输入字符串。我需要的是只选择符合包含字符的模式的字符串。 例如:

输入字符=“问” 它应该接受“问”,“sak”,“kas”...... 但不应该接受“akk”,“aas”......

现在我使用的格式如“^ [s | a | k] [s | a | k] [s | a | k] $” 但很可能它接受并重复了字符(“akk”),所以如果我使用它,我需要一些额外的检查,如果preg_match有效。

它有点复杂,可能有几个相同的字符: 输入“askk” 应匹配“akks”,但不能匹配“kkks”或“assk”。

我相信这个检查可以用单个正则表达式来完成,但我对regexp的了解不是很深。

(获取输入并显示结果我使用php)

3 个答案:

答案 0 :(得分:3)

使用正则表达式解决这类问题实际上非常困难。如果你有超前表达式,你可以这样做。这是一个例子,其中(?=...)是一个先行表达式。

/^(?=.*a)(?=.*s)(?=.*k).{3}$/

此处每个(?=.*a)表达式都匹配该字母,表达式中的任何位置,而。{3}指定它必须是三个字符。

如果您有重复的字符,这会变得复杂,但仍然可以。对于aask

/^(?=.*a.*a)(?=.*s)(?=.*k).{4}$/

只有在字符串中的任何位置有两个a时,第一个匹配。

你可以通过其他几种方式做到这一点。例如,您可以迭代每个字符并计算每个字母的数量,将其存储在一个数组(即O(n))中,或者您可以按字母顺序对字符进行排序(aks)并匹配字符串字符按字符(即O(无论你的排序算法是什么))。

答案 1 :(得分:2)

为什么在这里使用正则表达式?我没有看到好处。您可以做的是对输入字符串进行排序(例如'sak'和'ask'将变为'aks')并将该排序的字符串与参考字符串进行比较,在这种情况下为'aks'。或者只是在参考字符串'ask'上使用相同的函数。像这样:

function str_sort($str) {
    $chars = str_split($str);
    sort($chars);
    return implode('', $chars);
}

$pattern = 'ask';
$input = 'sak';
$valid = str_sort($pattern) == str_sort($input);

echo "Pattern: $pattern;\n";
echo "Input  : $input\n";
echo "Valid  : " . ($valid ? 'yes' : 'no') . "\n";

答案 2 :(得分:1)

这是“askk”的解决方案:

^(?=.*a)(?=.*s)(?=(?:.*k){2})[ask]{4}$

这个想法是使用先行来确保首先在字符串中存在正确的每个字符数,然后使用字符串的其余部分,确保只使用提供的集合中的字符。

See it working on Rubular.