2011-12-06 94 views
1

我有一些字符和字符串列表的输入字符串。我需要的是只选择符合包含字符的模式的字符串。 对于excample:正则表达式来检查字符是否匹配字符串

输入字符= “问” 应该接受 “问”, “SAK”, “KAS” ...... 但不应该接受 “AKK”, “AAS” ......

现在我用像 “^ [S | A | k]的[S | A | k]的[S | A | K] $” 的格局 但它probablem,它接受和重复字符( “AKK”),因此,如果我使用这个我需要一些额外的检查,如果preg_match的作品。

它使什么比较复杂一点,可以有一些相同的字符: 输入“askk” 应符合“akks”,而不是“kkks”或“assk”。

我相信这个检查可以用单正则表达式来完成,但是我对正则表达式的知识不是那么深。

(以获取输入和显示resuls我使用PHP)

+6

这听起来像是正则表达式不适合的东西。只需使用循环来计算每个字符在每个模式中出现的次数;它会更容易阅读和更容易编写。 –

回答

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"; 
+0

regexp只是第一次尝试,因为它通常足够强大。输入可以包含“任何字符”之类的东西,但当然可以用其他方式完成,也许更优雅。就在过去,当我需要文本搜索正则表达式帮助。 – Dainius

+1

哦,我喜欢正则表达式,但在这种情况下,它并不是最优雅的解决方案。对于你想检查的每一种模式,你都必须写一个不平凡的正则表达式,这在我看来并不值得这么麻烦。看看其他一些答案,看看我的意思。仅仅因为这可能并不意味着它需要完成。但你已经明白了,看起来似乎:) – Bart

3

它实际上是相当困难的解决使用正则表达式之类的问题。你可以做到这一点,如果你有前瞻性表达。以下是一个示例,其中(?=...)是一个超前表达式。

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

这里(?=.*a)表达式的每个匹配的字母,在表达式的任何位置,和{3}指定,它必须是三个字符。

这变得复杂时,你有重复的字符,但它仍然是可能的。对于aask

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

当第一个仅如果在字符串中的任何2个a s比。

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

+0

感谢您的回答。我希望这种方式可以解决搜索问题,如果没有,也许会需要重新考虑搜索算法。 – Dainius

1

这里是“askk”的解决方案:

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

的想法是使用向前看符号,以确保在字符串中存在的第一个每个字符的正确的号码,然后消耗串的保证休息只使用提供的集合中的字符。

See it working on Rubular.

+0

感谢您的回答和链接。 – Dainius

相关问题