2011-12-17 63 views
0

我想检查一个数字是否在数字的末尾出现一定数量的时间,比如2次。正则表达式应该可以说类似于“group [0-9]在结尾处2次”,并且我可以在正则表达式中插入一个PHP变量,指示“重复量”,替换为2.检查数字结尾的任何数字的重复?

什么正则表达式我应该使用吗?

P.S:希望这个片段的PHP code可以帮助验证,如果表达式中,如果任何数字被以数字的末尾重复时间,这应该检查,是正确的。

$Regex="/$[help]$/"; 
$Input=array(123456,112345,333333,123455,99); 
$CorrectOutput=array(0,0,0,1,1); 

echo "==WORKING IN EVERY TEST CASE?==<br>"; 

for($TestEntry=0;$TestEntry<=4;$TestEntry++){ 
    $Result = preg_match($Regex,$Input[$TestEntry]); 
    if($Result==$CorrectOutput[$TestEntry]){ 
     echo "Got ".$Result.", expected ".$CorrectOutput[$TestEntry]." - Good, seems to be working for " . $Input[$TestEntry] . ".<br>"; 
    }else{ 
     echo "Got ".$Result.", expected ".$CorrectOutput[$TestEntry]." - Sorry, not working for " . $Input[$TestEntry] . ".<br>"; 
    } 
} 

在此先感谢!

答案很可能是以下,非常感谢:

$Repetition = 3; //Number of times a digit repeats at the end of the number (min. 2) 
$Regex='/(?:^(\d)\1{'.($Repetition-1).'}$)|(?:^.*(\d)(?!\2{'.$Repetition.'})(\d)\3{'.($Repetition-1).'}$)/'; 

回答

2

试了很多次,终于得到它的工作:

$Regex="/(^|.)(^|(?!\\1))(.)\\3$/"; 

通过了所有的测试案例:)

+0

哇,当然看起来令人印象深刻!我仍然得到“对不起,123455工作。”和“对不起,不适用于99”。但是,嗯.. – Chris 2011-12-17 13:46:12

+0

这是因为你测试的网站在“和\,我在我自己的机器上运行这个代码使用PHP CLI得到正确的答案,你应该改变”到“上(例如'$ Regex ='/(^ |。)(^ |(!!\\ 1))(。)\\ 3 $ /';'on the that that you will get all 5 correct too :)网站。) – 2011-12-17 13:53:10

+0

不知道你是如何发现的,但你是对的!现在工作很好,非常感谢! – Chris 2011-12-17 13:57:40

-1

这正则表达式捕获2以上9的在一个字符串的结尾:

9{2,}\Z 

的9是什么寻找{2,}意味着“两次或更多次”,并且\ Z告诉只查看字符串的末尾。

也许这会帮助你开始。

这将具体地如下所示:

<?php 
$subject = "12389798712899"; 
$pattern = '/9{2,}\Z/'; 
preg_match($pattern, substr($subject,3), $matches); 
print_r($matches); 
?> 

这应该打印具有一个元素,阵列$比赛即搜索到的表达被发现一次。

,并使用在您的测试情况下,你会使用一个号码范围,因为你是对任何一位数字测试表达式:

$Regex='/[0-9]{2,}\Z/'; 
+0

尝试[0-9] {2} \ Z,但是这也行不通,不幸的是。你能解释一下有什么问题吗? – Chris 2011-12-17 13:20:44

+0

因为它只保证结尾处的两个字符都匹配[0-9],并且对于所有测试用例而言肯定是这样:) – 2011-12-17 13:38:18

1

你可以试试这一个,它的简单,易于分析

$Regex='/(?:^(\\d)\\1$)|(?:^.*(\\d)(?!\\2{2})(\\d)\\3$)/'; 

但是,此代码仅适用于您提供的网站(http://writecodeonline.com/php/)。原始正则表达式是

(?:^(\d)\1$)|(?:^.*(\d)(?!\2{2})(\d)\3$) 
+0

好吧,我应该用什么方式改变它来寻找3,4,5或更多的重复,而不是2?我应该改变{2}吗? (编辑:刚试过这样做,似乎没有工作) – Chris 2011-12-17 14:46:04

+0

你需要这个而不是它:(?:^(\ d)\ 1 {1} $)|(?:^。*(\ d) (?!\ 2 {2})(\ d)\ 3 {2} $),{}中的数字需要更改它 – freefcw 2011-12-17 14:47:51

+0

哪一个?看起来似乎没有任何事情发生。 – Chris 2011-12-17 14:50:53

相关问题