很抱歉,如果在某个地方得到了解答,但我找不到它。
我需要写一个regexp
来匹配包含0到9之间数字的字符串。例如:
e8v5i0l9ny3hw1f24z7q6
您可以看到数字[0-9]恰好以随机顺序存在一次。 (字母也只出现一次,但这是一项高级任务......)如果数字丢失或者任何数字出现多次,则必须匹配。
那么匹配这些字符串的最佳正则表达式是什么?我还在学习regex
,但无法找到解决方案。它是PCRE,在perl环境中运行,但我不能使用perl,只能使用它的正则表达式部分。对不起我的英文,并提前感谢你。
答案 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);
}
如果您需要数字字符串,那么只需提取数字,例如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";