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

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

在那篇文章里给出的正则是 /^1?$|^(11+?)\1+$/
其实我觉得完全没必要检测 0 1 之类的,因为根据百度百科里的解释,素数是从 开始的。
所以只要加一个判断条件 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 正则之 检测素数的更多相关文章

  1. js 正则之检测素数

    原文:js 正则之检测素数 相信很多人应该看过这篇文章,我第一次看到的时候是11年的样子,那时候学vbs的时候看过这个问题.原文<检查素数的正则表达式>,在文章里已经解释了他是怎么判断的, ...

  2. 撸一个JS正则小工具

    写完正则在浏览器上检测自己写得对不对实在是不方便,于是就撸了一个JS正则小demo出来. demo demo展示 项目地址 代码部分 首先把布局样式先写好. <!DOCTYPE html> ...

  3. js 正则学习小记之NFA引擎

    原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣.  求抱大腿,求大神调教. 之前大致有个印象,正 ...

  4. Js正则Replace方法

    JS正则的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\s+)|(\s+$)" ...

  5. JS正则和点击劫持代码(第十二天 9.27)

    JS正则 正则表达式:用单个字符串描述或者匹配符合特定语句规则的字符串一些字符序列组合在一起,可以简单也可以复杂模式的,可以去搜索,可以去替换 语法:/表达式/修饰符(可选)var para=/icq ...

  6. js正则

    JS正则 test:判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf") # true rep = /^\ ...

  7. js正则匹配的一个日常应用

    应用实例 1 /** 将段落中的 \n 转换为 <p></p>, 规范存储 */ 2 function formatParagraphForStore(val) { 3 var ...

  8. jS正则和WEB框架Django的入门

    JS正则 -test 判断字符串是否符合规定的正则表达式 -exec 获取匹配的数据 test的例子: 从上述的例子我们可以看出,如果rep.test匹配到了就返回true,否则返回false exe ...

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

    js正则实现二代身份证号码验证详解 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至 ...

随机推荐

  1. 「功能笔记」Spacemacs+Evil备忘录

    设置代理 (setq url-gateway-method 'socks) (setq socks-server '("Default server" "127.0.0. ...

  2. 现代OpenGL渲染管线介绍

    原文摘选自 现代OpenGL渲染管线介绍 此文对最新的OpenGL做一个简单的介绍,如有理解错误,敬请指正.英文原文: https://glumpy.github.io/modern-gl.html ...

  3. Git 命令简单罗列

    源教程出自 廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 整 ...

  4. 微软职位内部推荐-SW Engineer II for Embedded System

    微软近期Open的职位: Do you have a passion for embedded devices and services? &nbsp Does the following m ...

  5. PHP Laravel 连接并访问数据库

    第一次连接数据库 数据库配置位于config/database.php数据库用户名及密码等敏感信息位于.env文件创建一个测试表laravel_course <?php namespace Ap ...

  6. 使用tomcat,不能连接localhost/8080的解决办法

    首先,java的一些环境变量要解决. 其次,tomcat也应该各种环境变量设置好. 最后,把下图的那个地址重新选择一遍. 记住以上每一步弄好了之后都重启一下机器. 我也不知道为什么,但是有些就是从起之 ...

  7. LazyBug环境部署

    前言: LazyBug(授权协议:GPL)是一款PHP编写的开源HTTP接口测试管理系统,它集成了接口的测试.管理.维护.自动化回归等一系列工作,以实现对测试效率和管理效率的提高. 本次教程仅支持Wi ...

  8. 通过拓展Function.prototype实现一个AOP

    AOP(面向切面的编程)主要是将一些与核心业务逻辑模块无关的功能抽离出来,这些功能通常包括日志统计,安全控制,或者是异常处理等等. 我们要做的就是拓展Function.prototype来“动态植入” ...

  9. Linux内核实验作业六

    实验作业:分析Linux内核创建一个新进程的过程 20135313吴子怡.北京电子科技学院 [第一部分]阅读理解task_struct数据结构 1.进程是计算机中已运行程序的实体.在面向线程设计的系统 ...

  10. Linux命令(二十七) 用户组管理命令

    Linux提供了一系列的命令管理用户组.用户组就是具有相同特征的用户集合.每个用户都有一个用户组,系统能对一个用户组中所有用户进行集中管理,通过把相同属性的用户定义到同一用户组,并赋予该用户自一定的操 ...