Regex for number comparison?

泄露秘密 提交于 2019-12-11 16:32:22

问题


I would like to perform regex to return true/false if the input 5 digit from input matching data in database, no need to cater of the sequence, but need the exact numbers.

Eg: In database I have 12345

When I key in a 5 digit value into search, I want to find out whether it is matching the each number inside the 12345.

If I key in 34152- it should return true

If I key in 14325- it should return true

If I key in 65432- it should return false

If I key in 11234- it should return false

Eg: In database I have 44512

If I key in 21454- it should return true

If I key in 21455- it should return false

How to do this using php with regex


回答1:


This is a way avoiding regex

<?php
function cmpkey($a,$b){
  $aa =  str_split($a); sort($aa);
  $bb =  str_split($b); sort($bb);
  return ( implode("",$aa) == implode("",$bb));
}
?>



回答2:


Well, it's not going to be a trivial regex, I can tell you that. You could do something like this:

$chars = count_chars($input, 1);
$numbers = array();
foreach ($chars as $char => $frequency) {
    if (is_numeric(chr($char))) {
        $numbers[chr($char)] = $frequency;
    }
}
// that converts "11234" into array(1 => 2, 2 => 1, 3 => 1, 4 => 1)

Now, since MySQL doesn't support assertions in regex, you'll need to do this in multiple regexes:

$where = array();
foreach ($numbers AS $num => $count) {
    $not = "[^$num]";
    $regex = "^";
    for ($i = 0; $i < $count; $i++) {
        $regex .= "$not*$num";
    }
    $regex .= "$not*";
    $where[] = "numberField REGEXP '$regex'";
}

$where = '((' . implode(') AND (', $where).'))';

That'll produce:

( 
        (numberField REGEXP '^[^1]*1[^1]*1[^1]*$') 
    AND 
        (numberField REGEXP '^[^2]*2[^2]*$')
    AND
        (numberField REGEXP '^[^3]*3[^3]*$')
    AND
        (numberField REGEXP '^[^4]*4[^4]*$')
)

That should do it for you.

It's not pretty, but it should take care of all of the possible permutations for you, assuming that your stored data format is consistent...

But, depending on your needs, you should try to pull it out and process it in PHP. In which case the regex would be far simpler:

^(?=.*1.*1})(?=.*2)(?=.*3)(?=.*4)\d{5}$

Or, you could also pre-sort the number before you insert it. So instead of inserting 14231, you'd insert 11234. That way, you always know the sequence is ordered properly, so you just need to do numberField = '11234' instead of that gigantic beast above...




回答3:


Try using

^(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*5).{5}$

This will get much more complicated, when you have duplicate numbers. You really should not do this with regex. =)



来源:https://stackoverflow.com/questions/5044104/regex-for-number-comparison

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!