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