我有一些包含字符和字符串列表的输入字符串。我需要的是只选择符合包含字符的模式的字符串。 例如:
输入字符=“问” 它应该接受“问”,“sak”,“kas”...... 但不应该接受“akk”,“aas”......
现在我使用的格式如“^ [s | a | k] [s | a | k] [s | a | k] $” 但很可能它接受并重复了字符(“akk”),所以如果我使用它,我需要一些额外的检查,如果preg_match有效。
它有点复杂,可能有几个相同的字符: 输入“askk” 应匹配“akks”,但不能匹配“kkks”或“assk”。
我相信这个检查可以用单个正则表达式来完成,但我对regexp的了解不是很深。
(获取输入并显示结果我使用php)
答案 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}$
这个想法是使用先行来确保首先在字符串中存在正确的每个字符数,然后使用字符串的其余部分,确保只使用提供的集合中的字符。