Regex与澳大利亚商业编号(ABN)匹配

Regex与澳大利亚商业编号(ABN)匹配,regex,Regex,我需要一个正则表达式来匹配一个值,其中每个字符可以是0到9之间的数字或一个空格。该值必须正好包含11位数字 例如,它应该匹配格式为“01234567890”或“01234567890”的值 有人能帮我吗?你读过正则表达式吗?这是非常简单的 ^[0-9 ]+$ 为了未来可能会发现这一点的其他澳大利亚开发商: ^(\d*?){11}$ 匹配11个数字,每个数字后面有零个或多个空格 编辑: 正如@ElliottFrisch所提到的,ABNs也有一个适当验证的数学公式。使用正则表达式来正确验证ABN是

我需要一个正则表达式来匹配一个值,其中每个字符可以是0到9之间的数字或一个空格。该值必须正好包含11位数字

例如,它应该匹配格式为“01234567890”或“01234567890”的值


有人能帮我吗?

你读过正则表达式吗?这是非常简单的

^[0-9 ]+$

为了未来可能会发现这一点的其他澳大利亚开发商:

^(\d*?){11}$

匹配11个数字,每个数字后面有零个或多个空格

编辑:

正如@ElliottFrisch所提到的,ABNs也有一个适当验证的数学公式。使用正则表达式来正确验证ABN是非常困难的(或不可能的),尽管上面的正则表达式至少会将11位数字与空格匹配。如果您正在进行实际验证,那么在这种情况下,regex可能不是您的工具

进一步阅读:

下面是一个PHP实现:

从上述页面复制的代码,以防有一天不可用:

//   ValidateABN
//     Checks ABN for validity using the published 
//     ABN checksum algorithm.
//
//     Returns: true if the ABN is valid, false otherwise.
//      Source: http://www.clearwater.com.au/code
//      Author: Guy Carpenter
//     License: The author claims no rights to this code.  
//              Use it as you wish.

function ValidateABN($abn)
{
    $weights = array(10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19);

    // strip anything other than digits
    $abn = preg_replace("/[^\d]/","",$abn);

    // check length is 11 digits
    if (strlen($abn)==11) {
        // apply ato check method 
        $sum = 0;
        foreach ($weights as $position=>$weight) {
            $digit = $abn[$position] - ($position ? 0 : 1);
            $sum += $weight * $digit;
        }
        return ($sum % 89)==0;
    } 
    return false;
}
我在这里找到了一个javascript:


对于那些使用AngularJS的人,我已经写了一个指令来进行ABN验证:

var app = angular.module("demoapp", ["input-abn-directive"]);
public static bool ValidateABN(string abn)
{
    bool isValid = false;
    int[] weight = { 10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
    int weightedSum = 0;

    //ABN must not contain spaces, comma's or hypens
    abn = StripNonDigitData(abn);

    //ABN must be 11 digits long  
    if (!string.IsNullOrEmpty(abn) & Regex.IsMatch(abn, "^\\d{11}$"))
    {
        //Rules: 1,2,3  
        for (int i = 0; i <= weight.Length - 1; i++)
        {
            weightedSum += (int.Parse(abn[i].ToString()) - ((i == 0 ? 1 : 0))) * weight[i];
        }
        //Rules: 4,5  
        return ((weightedSum % 89) == 0);
    }
    return isValid;
}

public static string StripNonDigitData(string input)
{
    StringBuilder output = new StringBuilder("");
    foreach (char c in input)
    {
        if (char.IsDigit(c))
        {
            output.Append(c);
        }
    }
    return output.ToString();
}
Public Shared Function ValidateABN(ByVal abn As String) As Boolean
    Dim isValid As Boolean = False
    Dim weight() As Integer = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
    Dim weightedSum As Integer = 0

    'ABN must not contain spaces, comma's or hypens
    abn = StripNonDigitData(abn)

    'ABN must be 11 digits long  
    If Not String.IsNullOrEmpty(abn) And Regex.IsMatch(abn, "^\d{11}$") Then
        'Rules: 1,2,3  
        For i As Integer = 0 To weight.Length - 1
            weightedSum += (Integer.Parse(abn(i).ToString()) - (IIf(i = 0, 1, 0))) * weight(i)
        Next
        'Rules: 4,5  
        Return ((weightedSum Mod 89) = 0)
    End If
    Return isValid
End Function

Public Shared Function StripNonDigitData(ByVal input As String) As String
    Dim output As New StringBuilder("")
    For Each c As Char In input
        If Char.IsDigit(c) Then
            output.Append(c)
        End If
    Next
    Return output.ToString
End Function


JavaScript版本:

function checkABN(str) {
    if (!str || str.length !== 11) {
        return false;
    }
    var weights = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
        checksum = str.split('').map(Number).reduce(
        function(total, digit, index) {
            if (!index) {
                digit--;
            }
            return total + (digit * weights[index]);
        },
        0
    );

    if (!checksum || checksum % 89 !== 0) {
        return false;
    }

    return true;
}
/**
 * validate ABN
 * @param {string} abn
 * @return {boolean} is ABN number valid
 *    
 * 0. ABN must be 11 digits long
 * 1. Subtract 1 from the first (left) digit to give a new eleven digit number         
 * 2. Multiply each of the digits in this new number by its weighting factor         
 * 3. Sum the resulting 11 products         
 * 4. Divide the total by 89, noting the remainder         
 * 5. If the remainder is zero the number is valid  
 */
var validateABN = function(abn){

    var isValid = true;

    //remove all spaces
    abn = abn.replace(/\s/g, '');

    //0. ABN must be 11 digits long
    isValid &= abn && /^\d{11}$/.test(abn);

    if(isValid){

        var weightedSum = 0;
        var weight = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];

        //Rules: 1,2,3  
        for (var i = 0; i < weight.length; i++) {
            weightedSum += (parseInt(abn[i]) - ((i === 0) ? 1 : 0)) * weight[i]; 
        }

        //Rules: 4,5                 
        isValid &= ((weightedSum % 89) === 0);
    }

    return isValid;
};

//tests
console.log(validateABN('51824753556'));
console.log(validateABN('51 824 753 556'));
console.log(validateABN('51824744556'));
参考旧死链接:

确认ABN 以下公式可用于验证分配给您的ABN,或验证发放给您经营的企业的ABN

验证ABN:
从第一(左)位减去1,得到一个新的11位数字 将这个新数字中的每个数字乘以其加权因子 将得到的11个产品相加。
将总数除以89,并记下剩余部分。
如果余数为零,则该数字有效

数字位置
1. 2. 3. 4. 5. 6. 7. 8. 9 10 十一,

重量
10 1. 3. 5. 7. 9 11 13 15 17 十九,

例如,检查ABN 53 004 085 616的有效性

五, 3. 0 0 4. 0 8. 5. 6. 1. 六,

从第一个(左)数字中减去1得到新的数字 4. 3. 0 0 4. 0 8. 5. 6. 1. 六,

应用加权因子 10 1. 3. 5. 7. 9 11 13 15 17 十九,

(4x10)+(3x1)+(0x3)+(0x5)+(4x7)+(0x9)+(8x11)+(5x13)+(6x15)+(1x17)+(6x19) 40+3+0+0+0+28+0+88+65+90+17+114

445/89=5余数0

余数为零,因此该数字有效

以下是C#验证:

var app = angular.module("demoapp", ["input-abn-directive"]);
public static bool ValidateABN(string abn)
{
    bool isValid = false;
    int[] weight = { 10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
    int weightedSum = 0;

    //ABN must not contain spaces, comma's or hypens
    abn = StripNonDigitData(abn);

    //ABN must be 11 digits long  
    if (!string.IsNullOrEmpty(abn) & Regex.IsMatch(abn, "^\\d{11}$"))
    {
        //Rules: 1,2,3  
        for (int i = 0; i <= weight.Length - 1; i++)
        {
            weightedSum += (int.Parse(abn[i].ToString()) - ((i == 0 ? 1 : 0))) * weight[i];
        }
        //Rules: 4,5  
        return ((weightedSum % 89) == 0);
    }
    return isValid;
}

public static string StripNonDigitData(string input)
{
    StringBuilder output = new StringBuilder("");
    foreach (char c in input)
    {
        if (char.IsDigit(c))
        {
            output.Append(c);
        }
    }
    return output.ToString();
}
Public Shared Function ValidateABN(ByVal abn As String) As Boolean
    Dim isValid As Boolean = False
    Dim weight() As Integer = {10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
    Dim weightedSum As Integer = 0

    'ABN must not contain spaces, comma's or hypens
    abn = StripNonDigitData(abn)

    'ABN must be 11 digits long  
    If Not String.IsNullOrEmpty(abn) And Regex.IsMatch(abn, "^\d{11}$") Then
        'Rules: 1,2,3  
        For i As Integer = 0 To weight.Length - 1
            weightedSum += (Integer.Parse(abn(i).ToString()) - (IIf(i = 0, 1, 0))) * weight(i)
        Next
        'Rules: 4,5  
        Return ((weightedSum Mod 89) = 0)
    End If
    Return isValid
End Function

Public Shared Function StripNonDigitData(ByVal input As String) As String
    Dim output As New StringBuilder("")
    For Each c As Char In input
        If Char.IsDigit(c) Then
            output.Append(c)
        End If
    Next
    Return output.ToString
End Function

另一个JavaScript版本:

function checkABN(str) {
    if (!str || str.length !== 11) {
        return false;
    }
    var weights = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19],
        checksum = str.split('').map(Number).reduce(
        function(total, digit, index) {
            if (!index) {
                digit--;
            }
            return total + (digit * weights[index]);
        },
        0
    );

    if (!checksum || checksum % 89 !== 0) {
        return false;
    }

    return true;
}
/**
 * validate ABN
 * @param {string} abn
 * @return {boolean} is ABN number valid
 *    
 * 0. ABN must be 11 digits long
 * 1. Subtract 1 from the first (left) digit to give a new eleven digit number         
 * 2. Multiply each of the digits in this new number by its weighting factor         
 * 3. Sum the resulting 11 products         
 * 4. Divide the total by 89, noting the remainder         
 * 5. If the remainder is zero the number is valid  
 */
var validateABN = function(abn){

    var isValid = true;

    //remove all spaces
    abn = abn.replace(/\s/g, '');

    //0. ABN must be 11 digits long
    isValid &= abn && /^\d{11}$/.test(abn);

    if(isValid){

        var weightedSum = 0;
        var weight = [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19];

        //Rules: 1,2,3  
        for (var i = 0; i < weight.length; i++) {
            weightedSum += (parseInt(abn[i]) - ((i === 0) ? 1 : 0)) * weight[i]; 
        }

        //Rules: 4,5                 
        isValid &= ((weightedSum % 89) === 0);
    }

    return isValid;
};

//tests
console.log(validateABN('51824753556'));
console.log(validateABN('51 824 753 556'));
console.log(validateABN('51824744556'));
/**
*验证ABN
*@param{string}abn
*@return{boolean}是有效的ABN编号
*    
* 0. ABN的长度必须为11位
* 1. 从第一(左)位减去1,得到一个新的11位数字
* 2. 将这个新数字中的每个数字乘以其加权因子
* 3. 将得到的11个产品相加
* 4. 将总数除以89,并记下余数
* 5. 如果余数为零,则该数字有效
*/
var validateABN=功能(abn){
var isValid=true;
//删除所有空格
abn=abn.替换(/\s/g');
//0.ABN的长度必须为11位
isValid&=abn&/^\d{11}$/.test(abn);
如果(有效){
var加权总和=0;
变量权重=[10,1,3,5,7,9,11,13,15,17,19];
//规则:1,2,3
对于(变量i=0;i
问题的答案

许多答案将包括regex
[0-9]{11}
或类似的规则,这对于大多数情况都是足够的,但没有一个答案考虑到ABNs不能以零开头的事实

用于确定ABN的最简单的正则表达式是:
^\s*[1-9](\s*\d){10}\s*$
,它考虑了正确的位数、任意数量的空格和非零的前导位数

标准格式

标准的数字格式是2,3,3,3位分组模式,因为前两位数字构成校验位,其他9位是实际标识符

专门检查此格式是否带有空格的正则表达式是
^[1-9]\d(\s?\d{3}){3}$

可以使用PHP
number\u format
函数轻松模拟此格式

number_format( '12123123123', 0, '', ' ' ) === '12 123 123 123';
实际验证

与实际验证相关的任何其他答案都应该基本有效,但不是100%,除非进行额外检查以确保数字不以零开始。在当前最高评级答案的基础上,只需再做一次检查

if ( strlen( $abn ) === 11 && $abn[0] > 0 ) { // or $abn > 9999999999
    // ...
}

测试ABN Javascript实现

这些是正在工作的ABN:

  • 3305177556应该有效
  • 1406979460应该有用
  • 24302976253应该有效
这些是无效的ABN:

  • 65065987968应该失败
  • 12345 678 965应该失败
函数checkABN(值){
让权重=新数组(10,1,3,5,7,9,11,13,15,17,19);
设abn=value.replace(/\D/g,);//去掉非数字字符
如果(相对长度!=11){
返回false;
}
设abnFirstDigit=parseInt(abn.charAt(0))-1;//从第一个数字中减去1
abn=abnFirstDigit+abn.substring(1);//用减法后的值替换第一位数字
设total=0;
for(设i=0;i<11;i++)
总+=重量[i]*相对特征(i);
如果(总计=0 | |总计%89!=0){
返回false;
}否则{
返回true;
}
}
中的一个有问题
它不允许1406979460(应该是有效的)

SQL Server解决方案-在单个案例语句中

作为