正则表达式偶校验
Regex even parity
我正在尝试制作一个正则表达式来匹配一个数字,该数字的总和(即奇偶校验)是偶数。所以802(8+0+2)是偶数,902(9+0+2)是奇数。显然有一个算术法则可以在不计算或违反任何正则表达式规则的情况下执行此正则表达式。我为偶数制作了正则表达式,但不是偶数。
编辑:允许接受前导零,数字可以是任意长度(显然小于大多数语言中 int 的最大长度)
谢谢!
这真的很棘手(我是正则表达式的新手),但我刚刚了解到您可以在某些正则表达式中使用递归。
这是我想出的:
String regex = "(([02468]*[13579]){2}(?R))|[02468]*$";
这个想法是使用一个巧妙的简化,其中只有当奇数位数为偶数时,一个数的奇偶校验才为偶数,因为偶数个奇数位数的总和始终是偶数,而任意数量的奇数位数的总和偶数总是偶数。解释:
([02468]*[13579]){2} → 2 odd digits separated by any number of even digits
(?R) → Repeat the whole regex on the string after match
| → OR
[02468]*$ → the rest of String is 0 or more even digits
编辑
递归只是让表示法更简单,但是不用递归也是可以的(有些语言比如Java没有实现递归),思路是一样的:
String regex = "(([02468]*[13579]){2})*[02468]*$"
我正在尝试制作一个正则表达式来匹配一个数字,该数字的总和(即奇偶校验)是偶数。所以802(8+0+2)是偶数,902(9+0+2)是奇数。显然有一个算术法则可以在不计算或违反任何正则表达式规则的情况下执行此正则表达式。我为偶数制作了正则表达式,但不是偶数。
编辑:允许接受前导零,数字可以是任意长度(显然小于大多数语言中 int 的最大长度)
谢谢!
这真的很棘手(我是正则表达式的新手),但我刚刚了解到您可以在某些正则表达式中使用递归。
这是我想出的:
String regex = "(([02468]*[13579]){2}(?R))|[02468]*$";
这个想法是使用一个巧妙的简化,其中只有当奇数位数为偶数时,一个数的奇偶校验才为偶数,因为偶数个奇数位数的总和始终是偶数,而任意数量的奇数位数的总和偶数总是偶数。解释:
([02468]*[13579]){2} → 2 odd digits separated by any number of even digits
(?R) → Repeat the whole regex on the string after match
| → OR
[02468]*$ → the rest of String is 0 or more even digits
编辑
递归只是让表示法更简单,但是不用递归也是可以的(有些语言比如Java没有实现递归),思路是一样的:
String regex = "(([02468]*[13579]){2})*[02468]*$"