js 正则之检测素数

相信很多人应该看过这篇文章,我第一次看到的时候是11年的样子,那时候学vbs的时候看过这个问题。
原文《检查素数的正则表达式》,在文章里已经解释了他是怎么判断的,我就不啰嗦了。
我们来说说 js 如何实现它吧。

先来看看什么是素数,在《质数 - 百度百科》里有详细的说明,而且也说了一些求素数的方法,什么6N+1法等。。
这些什么算法都不是我们要谈的,我们只说正则。

在那篇文章里给出的正则是 /^1?$|^(11+?)\1+$/
其实我觉得完全没必要检测 0 1 之类的,因为根据百度百科里的解释,素数是从 2 开始的。
所以只要加一个判断条件 n < 2 的都不是素数,其他的则用 /^(11+?)\1+$/ 进行验证即可,
不仅提升了效率,而且防止传入负数而报错。

我们先来写个遍历 n 以内素数的函数吧。

/**
 * 遍历素数
 * @param  {Number} max 遍历 2-max 之间的素数
 * @return {Array}      返回 2-max 之间所有素数
 */
function prime(max) {
    var re = new RegExp(‘^(11+?)\\1+$‘), // 检测质数正则
        str = ‘1‘, // 根据当前 i 生成对应个数 1
        i = 1, // 计数器
        ret = []; // 质数结果集
    while (max > i++)
        re.test(str += ‘1‘) || ret.push(i);
    return ret;
}
var arr = prime(100);
console.log(arr);

在代码里发现  var re = new RegExp(‘^(11+?)\\1+$‘)  为什么不直接写  var re = /^(11+?)\1+$/  呢?
回去翻下我写的几篇正则文章就会找到答案了。
最传统的写法往往是嵌套循环来遍历素数,但是有了正则的帮助,代码简洁优雅。

如果要判断素数的话,那就更简洁了。

/**
 * 判断是否是素数
 * @param  {Number} n  要判断是数字
 * @return {Boolean}   返回 true|false
 */
function isPrime(n) {
    return n < 2 ? false : !/^(11+?)\1+$/.test(Array(n + 1).join(‘1‘));
}

console.log(-2, isPrime(-2));
console.log(1, isPrime(1));
console.log(2, isPrime(2));
console.log(11, isPrime(11));

好了,今天的分享就这么点东西,虽然没什么实际用途,但是可以开阔大家的眼界。
正则不仅仅就是匹配字符串,还能判断素数,二元/三元方程有无解等等等等看似不可思议的逻辑。

js 正则之检测素数

时间: 2024-10-15 07:48:39

js 正则之检测素数的相关文章

js正则相关

js正则相关 1.检测是否是数字,包括整数,小数 var str = prompt("请输入一个数字"); var reg = /^\-?(0|[1-9]\d*)(\.\d+)?$/ ; if(reg.test(num)){ alert("正确"); }else( alert("错误")); 2 .检测是否是本地电话. var tel = prompt("请输入本地电话"); var reg = /^\d{3,4}\-\d{8

浅谈 js 正则之 test 方法

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

js通用方法检测浏览器是否已安装指定插件(IE与非IE通用)

/* * 检测是否已安装指定插件 * * pluginName 插件名称 */ function checkPlugins(pluginName) { var np = navigator.plugins; if (window.ActiveXObject) { // IE // ActiveXObject的对象名 var activexObjectName = pluginName + "." + pluginName; try { var axobj = eval("ne

js 正则练习之语法高亮

原文:js 正则练习之语法高亮 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解.今天就分析下 次碳酸钴 和 Barret Lee 语法高亮实现. 先说 Barret Lee 的这篇 <玩转正则之highlight高亮>之前看的时候只觉的神奇,特别是下面那个一步一步分开匹配的例子,更是霸气测漏,不过作者也说了,分开只是为了演示方便,可以很直观的看到这一步匹配了什么,不然一步到位匹配完成,你都不知道发生了什么就处理完毕了.来看下他的正则 (/^\

python第九十五天--js正则

定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^和$,m模式也会使用^$来匹配换行的内容) var pattern = /^Java\w*/gm; var text = "JavaScript is more fun than \nJavaEE or JavaBeans!"; result = pattern.exec(text) re

js正则验证方法大全

js正则验证方法大全 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

js正则实现二代身份证号码验证详解

js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码表示编码对象常住户口所在县(市.旗.区)的行政区划代码. 出生日期码表示编码对象出生的年.月.日,其中年份用四位数字表示,年.月.日之间不用分隔符. 顺序码表示同一地址码所标识的区域范围内,对同年.月.日出生的人员

记录一下JS正则的坑

JS正则的单行模式有点问题 总之 . 符号匹配换行符号会有问题 暂时的解决方案是 html = html.replace(/[\r\n]/g,""); 附加一个 html = html.replace(/\s{2,}/g," "); 清理多余空格(注意 可能会误伤正文内容 最好对标签内容进行局部处理)

常用JS正则匹配函数

//校验用户名:只能输入1-30个字母 function isTrueName(s) { var patrn=/^[a-zA-Z]{1,30}$/; if (!patrn.exec(s)) return false return true } //校验密码:只能输入6-20个字母.数字.下划线 function isPasswd(s) { var patrn=/^(/w){6,20}$/; if (!patrn.exec(s)) return false return true } //校验普通