用正则表达式判断一个二进制数是否能被3整除

作者&投稿:盛背 (若有异议请与网页底部的电邮联系)
使用正则表达式判断二进制数字是否能被3整除~

reg = /^(0+|0*1((10*1)|(01*0))*10*)$/
其中

0+表示字符串可以全为0
第一个0*表示字符串可以以0开头
核心的句式是:1((10*1)|(01*0))*10*)
原理如下:
一个二进制数后面加一个“0”相当于该数乘以2,一个二进制数后面加一个“1”相当于该数乘2加1。
设定三个状态,分别叫做0、1和2,它们表示当前的数除以3所得的余数。有以下的几种可能:
0@0 => 0 表示状态0后面是0时,变成状态0
0@1 => 0 表示状态0后面是1时,变成状态1
1@0 => 2 表示状态1后面是0时,变成状态2
1@1 => 0 表示状态1后面是1时,变成状态0
2@0 => 1 表示状态2后面是0时,变成状态1
2@1 => 2 表示状态2后面是1时,变成状态2

状态0既是我们的初始状态,也是我们的最终状态。我们的自动机就做好了。现在,假如二进制数10010走进来了。从状态0出发,机器首先读到一个“1”,于是当前位置挪到状态1,表明目前该数模3余1;然后,系统读了一个“0”,我们紧跟着走到状态2,表明二进制数“10”被3除余2;下一步,我们回到状态1,表明“100”除以3余1;再往后,我们得知“1001”能被3整除。最后呢,我们读到一个0,“1001”的两倍当然还是能被3整除,我们依旧停留在原位。我们得到结论:二进制数10010能被3整除。
有限状态自动机是可以转化为正则表达式的。上面的这个自动机转化起来非常容易。我们可以先试着用自然语言叙述一下。首先,每个二进制数第一位必然为“1”。到达状态1后,我们可以随意地、任意多次地在状态1周围绕圈圈,最终回到状态1。临近末尾,我们再读到一个“1”返回状态0,这之后随便读多少个“0”都可以了。现在问题分解为:我们又如何用正则表达式表述“从状态1出发随意地走最终回到状态1”呢?在本例中,这是很好描述的:它可以是字符串“1000..001”和“0111..110”的任意组合。把这些东西用正则表达式写出来,就是我们刚才那个神秘的式子:1((10*1)|(01*0))*10*

这样判断二进制:
"^[01]+$"

补充:你那样的话,特殊字符都会被通过的,我上面的表示只允许0和1,其余任何符号都不允许。我前面的^表示内容开始,后面的$表示内容结束,意思是所有内容都必须为0或者1

补充:
这样才是排除:[^]

例如,下面这个表达式可以匹配01串S当且仅当S是一个可以被3整除的二进制数。

^1((10*1)|(01*0))*10*$

如果你不信的话,不妨把下面这段代码粘贴进浏览器的地址栏,然后回车运行一下:

javascript:alert(/^1((10*1)|(01*0))*10*$/.test("1000000100"))

被test的是516的二进制表达。516可以被3整除,因此程序返回true。你可以自己把1000000100换成其它的二进制数试试。
但是呢,从这个正则表达式里我们竟看不出任何端倪。奇怪了,为什么这个正则表达式可以用于判断整除性?能被3整除的二进制数究竟有何规律?

其实,能被3整除的二进制数并没有什么明显的规律。这个正则表达式的求法可以说是相当暴力的。这一切的谜底很简单——判断一个数的整除性能轻易地用有限状态自动机实现,而有限状态自动机又可以翻译成正则表达式。

注意到,一个二进制数后面加一个“0”相当于该数乘以2,一个二进制数后面加一个“1”相当于该数乘2加1。设定三个状态,分别叫做0、1和2,它们表示当前的数除以3所得的余数。如果对于某个i和j,有i*2≡j (mod 3),就加一条路径i→j,路径上标一个字符“0”;如果i*2+1≡j (mod 3),则在路径i→j上标记“1”。状态0既是我们的初始状态,也是我们的最终状态。我们的自动机就做好了。现在,假如二进制数10010走进来了。从状态0出发,机器首先读到一个“1”,于是当前位置挪到状态1,表明目前该数模3余1;然后,系统读了一个“0”,我们紧跟着走到状态2,表明二进制数“10”被3除余2;下一步,我们回到状态1,表明“100”除以3余1;再往后,我们得知“1001”能被3整除。最后呢,我们读到一个0,“1001”的两倍当然还是能被3整除,我们依旧停留在原位。我们得到结论:二进制数10010能被3整除。
有限状态自动机是可以转化为正则表达式的。上面的这个自动机转化起来非常容易。我们可以先试着用自然语言叙述一下。首先,每个二进制数第一位必然为“1”。到达状态1后,我们可以随意地、任意多次地在状态1周围绕圈圈,最终回到状态1。临近末尾,我们再读到一个“1”返回状态0,这之后随便读多少个“0”都可以了。现在问题分解为:我们又如何用正则表达式表述“从状态1出发随意地走最终回到状态1”呢?在本例中,这是很好描述的:它可以是字符串“1000..001”和“0111..110”的任意组合。把这些东西用正则表达式写出来,就是我们刚才那个神秘的式子:1((10*1)|(01*0))*10* 。
从原理上说,我们可以这种方法求出任意进制下用于任意数的整除性判断的正则表达式。只不过,它们所对应的自动机都更加复杂,从而得出一长串令人眼花缭乱的表达式。本文开头我把1((10*1)|(01*0))*10*的来源作为一个有趣的问题提出来,因为这个式子恰好不长,让人很难想到这背后藏有一个普适的暴力算法。


正则表达式如何判断是不是一个数字
1、^ 表示打头的字符要匹配紧跟^后面的规则 。2、$ 表示打头的字符要匹配紧靠$前面的规则 。3、\/^ 和 $\/成对使用是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。4、\\d表示数字 。5、[ ]方括号表示查找范围 。6、n{X,} 匹配包含至少 X 个 n 的序列的字符串。

如何用正则表达式判断一个变量是否为double类型
1、用正则表达式判断变量为double类型,程序代码java">public static booleisDouble(String str) {Pattern pattern = Pattern.compile("^[-\/\/+]?\/\/d+(\/\/.\/\/d*)?|\/\/.\/\/d+$");return pattern.matcher(str).matches();2、如果不用正则表达式,下面的函数也可以判断变量是否为double类java">publ...

java正则表达式判断一个字符串是否是非负整数
满足以下两个表达式之一都可以:^\\d+$ 或 ^[1-9]\\d*|0 示例:import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String content = "987546"; String pattern = "^\\d+$"; boolean isMatch = Pattern.matches(pattern, content); S...

java中正则表达式如何使用?比如判断一个字符串是否满足某种格式,给个...
\/\/下面这个正则表达式匹配不能以.css,.html,.js,.json或者.xml结尾的字符串import java.util.regex.Matcher;import java.util.regex.Pattern;public class CC { public static void main(String[] args) { String s="xxxx.js.jss";\/\/目标字符串 String regex="((?!\\\\.((css)|(html)|(...

怎么用正则表达式判断是否为+或-一个数?
单独写正则,那是很简单:((\\+)|(-))?\\d+ 或 ^((\\+)|(-))?\\d+ 但是不知道你是用在什么环境中?且不同的语言,正则的写法,略有区别的。

求一个正则表达式 判断一个句子里是否包含一个指定的单词
public static void main(String[] args) throws Exception { String a = "see me\\r\\n";String b = "s me\\r\\n";System.out.println(a.indexOf("see"));System.out.println(Pattern.matches(".*see.*(\\r\\n)?", a) + "\\r\\n" + Pattern.matches(".*see.*", b));String patte...

哪位高手知道如何写一个正则表达式 来判断一个字符串中只可以有数字和...
可以反过来做,判断一个字符串中有没有除数字和空格以外的字符。定义一个正则表达式为:"[^0-9 ]"。如果和字符串匹配成功则说明不符合要求。用c#编写代码可以这样写:Regex pattern = new Regex("[^0-9 ]");bool b = !(pattern.IsMatch("123 3")); \/\/ true b = !(pattern.IsMatch(...

java用正则表达式判断一个18位身份证号是否有效
String regex = "^[1-9]\\\\d{5}(18|19|([23]\\\\d))\\\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\\\d{3}[0-9Xx]$";而且就算正则表达式正确了,你的逻辑判断代码也是有问题,完成代码如下,请参考:public class Homework {public static void main(String[]...

正则表达式:如何判断一个数 为1-9位整数(非零) 或者 后边加2位小数 即...
^(?:[1-9]\\d{0,8}(?:\\.\\d{2})?|0\\.\\d{2})前面 [1-9]\\d{0,8} 表示 数字最前面位数的值是1-9后面跟0到8位数字,这里已经排除了 0 的可能性 (?:\\.\\d{2})? 表示有小数点后2位小数,或者根本没有小数 0\\.\\d{2}表示运行出现 0.33之类的小数 ...

...用户输入的数字是一个合法的电话号码的正则表达式,包括住宅电话与移 ...
\/\/ TODO : 用正则表达式判断一个字符串中是否为电话号码,--无误格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX String s="333212";Pattern p=Pattern.compile("^(\\(\\d{3:4}\\)|\\d{3:4}-)?\\d{7:8}$");Matcher m=p.matcher(s);System.out.println...

同仁县18315974179: 用正则表达式判断一个二进制数是否能被3整除 -
查贱欣普: 例如,下面这个表达式可以匹配01串S当且仅当S是一个可以被3整除的二进制数.<br><br>^1((10*1)|(01*0))*10*$<br><br> 如果你不信的话,不妨把下面这段代码粘贴进浏览器的地址栏,然后回车运行一下:<br><br>javascript:alert(/^1((10*1)|(...

同仁县18315974179: 使用正则表达式判断二进制数字是否能被3整除 -
查贱欣普: reg = /^(0+|0*1((10*1)|(01*0))*10*)$/ 其中0+表示字符串可以全为0 第一个0*表示字符串可以以0开头 核心的句式是:1((10*1)|(01*0))*10*) 原理如下:一个二进制数后面加一个“0”相当于该数乘以2,一个二进制数后面加一个“1”相当于该数乘2...

同仁县18315974179: 正则判断数字是否能被5整除 -
查贱欣普: 无论你使用哪一种编程语言(或者是正则表达式也好)进行编程,首先必须要想明白的就是:算法!首先考虑能够被 5 整除的整数的特点是什么?就是给出任一个数字,判断其个位上的数字是否是 0、或者是 5.这个算法想通了,至于说你使用哪一种方法(编程语言也好、或者是正则表达式也好)来实现就非常容易了.你说对不对?

同仁县18315974179: java如何判断一个值是否为二进制 -
查贱欣普: 用正则表达式啊 值内包含1和0外的其他字符就不算

同仁县18315974179: 二进制的正则表达式是什么? -
查贱欣普: 这样判断二进制: "^[01]+$"补充:你那样的话,特殊字符都会被通过的,我上面的表示只允许0和1,其余任何符号都不允许.我前面的^表示内容开始,后面的$表示内容结束,意思是所有内容都必须为0或者1补充: 这样才是排除:[^]

同仁县18315974179: 新建一个控制台,如何检测输入的数值,是二进制数阿?用c#语言编译
查贱欣普: 用正则表达式直接搞定

同仁县18315974179: C# 中判断字符串是否为二进制的格式 -
查贱欣普: 使用正则表达式,如:System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex("[01]"); r.IsMatch(s);

同仁县18315974179: 如何判断一个二进制正整数B=b6b5b4b3b2b1b0能否被(4)10 整除? -
查贱欣普: 1、新建一个html文件,命名为test.html. 2、在test.html文件中,使用input标签创建两个数字输入框,并分别设置其id为num,num2,主要用于下面通过此id获得input对象. 3、在test.html文件中,使用button标签创建一个按钮,按钮名称为“...

同仁县18315974179: 请编写程序:二进制转换成十六进制. -
查贱欣普: 弄了一个只能换算正整数的: import java.util.Scanner; import java.util.regex.Pattern;public class test{ /*如果输入的字符串不是4倍数,就要补齐位数,故用该变量接收补齐后的二进制数**/private static String tempStr = ""; //输出换算后的...

同仁县18315974179: 如何判断一个二进制数N= a6a5a4a3a2a1能否被8整除 -
查贱欣普: 末尾三位a3a2a1,如果都是0,此数字即可被8整除. ----------- 为嘛呢? 先从简单的说.什么样的二进制数可以被2整除呢? 肯定是:最末一位数是0的. 末尾数要是1,除以2,肯定余1!什么样的二进制数可以被4整除呢? 肯定是:末尾2位...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网