查找随机字符串中的所有十个不同数字

时间:2014-04-14 10:09:41

标签: regex pcre

很抱歉,如果在某个地方得到了解答,但我找不到它。

我需要写一个regexp来匹配包含0到9之间数字的字符串。例如:

e8v5i0l9ny3hw1f24z7q6

您可以看到数字[0-9]恰好以随机顺序存在一次。 (字母也只出现一次,但这是一项高级任务......)如果数字丢失或者任何数字出现多次,则必须匹配。

那么匹配这些字符串的最佳正则表达式是什么?我还在学习regex,但无法找到解决方案。它是PCRE,在perl环境中运行,但我不能使用perl,只能使用它的正则表达式部分。对不起我的英文,并提前感谢你。

3 个答案:

答案 0 :(得分:6)

验证字符串的模式怎么样:

^\D*(?>(\d)(?!.*\1)\D*){10}$
  • ^\D*从任意数量的字符开始,无数字
  • (?>(\d)(?!.*\1)\D*){10}后跟10x:一个数字(在第一个捕获组中捕获),如果捕获的数字不在前面,后跟任意数量的\D个非数字,使用负数{{3 }}。所以10x一个数字,其本身没有提前连续应该导致10个不同的[0-9]

\d [0-9]\D[^0-9]为否定$str = "e8v5i0l9ny3hw1f24z7q6"; $pattern = '/^\D*(?>(\d)(?!.*\1)\D*){10}$/'; if(preg_match($pattern, $str)) { echo preg_replace('/\D+/', "", $str); }

lookaheadshorthand


如果您需要数字字符串,那么只需提取数字,例如php(Test at regex101

{{1}}

答案 1 :(得分:0)

很容易创建一个正则表达式,该表达式匹配数字的一个特定排列并且与其他字符相同。 E.g。

^[^\d]*0[^\d]1[^\d]*2[^\d]*3[^\d]*4[^\d]*5[^\d]*6[^\d]*7[^\d]*8[^\d]*9[^\d]*$

你可以组合10!使用|

进行每种可能排列的表达式

尽管这完全不实用,但它表明这样的常规表达式(没有预见)确实是可能的。

然而,如果没有正则表达式匹配,这样做会更好。

答案 2 :(得分:0)

$s = "e8v5i0l9ny3hw1f24z7q6";
$s = preg_replace('/[^\d]/i', '', $s); //remove non digits
if(strlen($s) == 10) //do we have 10 digits ?
if (!preg_match('/(\d)(\1+)/i', $s))  //if no repeated digits
echo "String has 10 different digits";

http://ideone.com/eY4eGx