元字符

预定义类

边界

^在中括号中时,匹配非hello的

str = 'hello world'
str.match(/[^hello]/g) //[" ", "w", "r", "d"] 匹配非hello的

^不在中括号时,匹配以hello开头的

str = 'hello world'
str.match(/^hello/g) //["hello"]

$以..结尾

str = 'yeah world hello'
str.match(/hello$/g) //["hello"]
str = 'hello1 yeah world hello2 root hello3'
str.match(/hello\d/g) //["hello1", "hello2", "hello3"]
str.match(/hello\d$/g) //["hello3"]
str.match(/^hello\d/g) //["hello1"]

\b单词边界

str = 'hello1 hello2orld hello3 12-hello4-333z ccchello7'
str.match(/\bhello\d\b/g) //["hello1", "hello3", "hello4"]
str.match(/\bhello\d/g) // ["hello1", "hello2", "hello3", "hello4"]

精准判断是否在其中

str = 'header3 clearfix active header-fixed'  //判断是否有header
str.match(/\bheader\b/g) //["header"] 这里用\b其实是错误的,因为把header-fixed当成了header //应该用
str.match(/(^|\s)header($|\s)/g) //null

修改str后重新判断一次

str = 'header clearfix active header-fixed'
str.match(/(^|\s)header($|\s)/g) //["header"]

量词

 
str = 'http://github.com'
str.match(/http?:\/\/.+/g) //["http://github.com"]
 
 

+号和*号

//用+号 和 用*号
str = 'http://github.com'
str2 = 'https://github.com'
str3 = 'httpssssss://github.com' str.match(/https+:\/\/.+/g) //null 因为+必须出现一次或多次s
str.match(/https*:\/\/.+/g) //["http://github.com"] *是0次或多次,所以可以匹配
str2.match(/https*:\/\/.+/g) //["https://github.com"]
str3.match(/https*:\/\/.+/g) //["httpssssss://github.com"]
匹配是否是url的正则:
str.match(/^(https?:)?\/\/.+/g)

//测试
str = 'http://github.com'
str2 = 'https://github.com'
str3 = 'httpssssss://github.com'
str4 = '//github.com' str.match(/^(https?:)?\/\/.+/g) //["http://github.com"]
str2.match(/^(https?:)?\/\/.+/g) //["https://github.com"]
str3.match(/^(https?:)?\/\/.+/g) //null
str4.match(/^(https?:)?\/\/.+/g) //["//github.com"]
判断用户输入的是一个手机号
str.match(/^1[34578]\d{9}$/g)

//测试
str = '17300001111'
str2 = '12300001111'
str3 = 'ab100001111' str.match(/^1[34578]\d{9}$/g) //["17300001111"]
str2.match(/^1[34578]\d{9}$/g) //null
str3.match(/^1[34578]\d{9}$/g) //null

即写成函数,判断用户输入的是否是手机号:

function isPhoneNum(str) {
if(/^1[34578]\d{9}$/g.test(str)) {
console.log("是正确的手机号")
} else {
console.log("格式错误,不是正确的手机号")
}
}

贪婪模式 / 非贪婪模式

看了上面介绍的量词,比如{3,5}这个量词,要是在句子中出现了十次,那么他是每次匹配三个还是五个,反正3、4、5都满足3~5的条件

量词在默认下是尽可能多的匹配的,也就是大家常说的贪婪模式

'123456789'.match(/\d{3,5}/g);     //["12345", "6789"]

既然有贪婪模式,那么肯定会有非贪婪模式,让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试,做法很简单,在量词后加上?即可

'123456789'.match(/\d{3,5}?/g);    //["123", "456", "789"]

参考:贪婪模式/非贪婪模式之详解 (具体图文分析)

分组

有时候我们希望使用量词的时候匹配多个字符,而不是只是匹配一个,比如希望匹配evenyao出现20次的字符串,我们如果写成 evenyao{20} 的话匹配的是evenyao 中 o 出现20次

    /evenyao{20}/

怎么把evenyao作为一个整体呢?使用()就可以达到此目的,我们称为分组

    /(evenyao){20}/

var reg1 = /hello|world/
//等同于
var reg2 = /(hello)|(world)/

分组嵌套

  • 从HTML字符串中取出 URL
var str = '<a href="https://github.com">'
str.match(/href="(https?:\/\/.+?)"/) //["href="https://github.com"", "https://github.com", index: 3, input: "<a href="https://github.com">", groups: undefined]
str.match(/href="(https?:\/\/.+?)"/)[1] //https://github.com
 
 

前瞻


//even(?=yao) //匹配后面是yao的even (/even(?=yao)/).exec('evenyao123'); //['even']
(/even(?=yao)/).exec('even123yao'); //null //even(?!yao) //匹配后面不yao的even (/even(?!yao)/).exec('evenyao123'); //null
(/even(?!yao)/).exec('even123yao'); //['even']

JavaScript 正则相关函数

  • 去除字符串两边的空白字符的函数
function trim(str) {
return str.replace(/^\s*|\s*$/g,'')
} trim(' hello word ')
  • 判断用户输入的是不是合法用户名(长度6-20个字符,只能包括字母、数字、下划线)
function isValidUsername(str) {
var reg = /^\w{6,20}$/g
if(reg.test(str)) {
console.log('是合法的用户名')
} else {
console.log('不是合法的用户名')
}
} isValidUsername('evenyao') //是合法的用户名
  • 判断用户输入的是否是邮箱的函数
function isEmail(str) {
var reg = /^\w+\.?\w+@\w+(\.\w+){1,3}$/g //{1,3}是因为大多邮箱@后不会超过3个域名段,如果有这种邮箱格式,换成*即可
if(reg.test(str)) {
console.log('是正确的邮箱地址')
} else {
console.log('不是正确的邮箱地址')
}
} isEmail('17300001111@163.com') //是正确的邮箱地址
  • 判断用户输入的是否是手机号的函数
function isPhoneNum(str) {
var reg = /^1[34578]\d{9}$/g
if(reg.test(str)){
console.log('是正确的手机号格式')
} else {
console.log('不是正确的手机号格式')
}
} isPhoneNum(17300001111) //是正确的手机号格式

JavaScript 正则的方法

test

test方法用于测试字符串参数中是否存正则表达式模式,如果存在则返回true,否则返回false
上面的正则函数就是利用了test返回布尔类型做的

exec

exec方法用于正则表达式模式在字符串中运行查找,如果exec()找到了匹配的文本,则返回一个结果数组,否则返回 null

除了数组元素和length属性之外,exec()方法返回对象还包括两个属性。

  • index 属性声明的是匹配文本的第一个字符的位置
  • input 属性则存放的是被检索的字符串string
var str = '123 456 789'  //"123 456 789"
var reg = /\d{3}/
reg.exec(str)
 

用while进行exec方法

var str = '123 456 789'  //"123 456 789"
var reg = /\d{3}/g
while(result = reg.exec(str)) {
console.log(result[0]) //因为返回的是数组,所以每次取0位置的值,直到null
}
 

match

match()方法将检索字符串,以找到一个或多个与regexp匹配的文本。但regexp是否具有标志 g对结果影响很大。

非全局调用

如果regexp没有标志g,那么match()方法就只能在字符串中执行一次匹配。如果没有找到任何匹配的文本,match() 将返回null。否则它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。

该数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性

  • index 属性声明的是匹配文本的起始字符在字符串中的位置
  • input 属性声明的是对 stringObject 的引用

例子
var r = 'aaa123456'.match(/\d/)

全局调用

如果regexp具有标志g则match()方法将执行全局检索,找到字符串中的所有匹配子字符串

若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组

不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是字符串中所有的匹配子串,而且也没有index属性或input属性。

例子
var r = 'aaa123456'.match(/\d/g)

replace

  • 去除字符串两边的空白字符
var str = '  hello world     '
str.replace(/^\s*|\s*$/g,'') //先正则匹配,再用''替换
 

split

我们经常使用split方法把字符串分割为字符数组

'a,b,c,d'.split(','); //["a", "b", "c", "d"]

和replace方法类似,在一些复杂的分割情况下我们可以使用正则表达式解决

'a1b2c3d'.split(/\d/); //["a", "b", "c", "d"]

例子:

var str = 'h  e   llo   wo   rld'   //"h  e   llo   wo   rld"
str.split(/\s*/) // ["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"]
 

JavaScript 正则的更多相关文章

  1. JavaScript正则实战

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  2. 我也谈javascript正则匹配

    一.javascript 正则全局匹配 g 慎用test()方法 来个例子: var a = /^[a-z]+/gi; a.test('bb123'); //true a.lastIndex ; // ...

  3. JavaScript正则式入门

    正则式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规 ...

  4. JavaScript正则中\1\2的作用

    一.示例 1. 验证6个相同的数字 var reg = new RegExp(/^(\d)\1{5}/g); var a = '333333'; if(reg.test(a)) { alert('ri ...

  5. JavaScript 正则表达收集整理

    JavaScript 正则表达收集整理 //可为空 /^\s*$/ //密码验证,必须且只含有数字和字母,可以拥有英文符号,6-17位 /(?=.{,})(?=.*\d)(?=.*[a-z])[\x2 ...

  6. JavaScript正则常用知识总结

    一.JavaScript正则相关方法 str.match(regexp)与regexp.exec(str)功能类似. str.search(regexp)与regexp.test(str)功能类似. ...

  7. JavaScript 正则的使用方法

    JavaScript正则方法 1.compile 编译一个正则表达式对象 rgExp.compile(pattern, [flags])  pattern字符串表达式 2.exec 在指定字符串中执行 ...

  8. Javascript正则构造函数与正则表达字面量&&常用正则表达式

    本文不讨论正则表达式入门,即如何使用正则匹配.讨论的是两种创建正则表达式的优劣和一些细节,最后给出一些常用正则匹配表达式. Javascript中的正则表达式也是对象,我们可以使用两种方法创建正则表达 ...

  9. JavaScript正则验证邮箱

    正则表达式/^正则$/.test() <html> <head> <title>JavaScript</title> <meta charset= ...

随机推荐

  1. Tag It 一款 Jquery控件,当你在文本框中输入逗号时,自动帮你分隔开相关内容

    Demo地址:http://webspirited.com/tagit/ 使用方法: 除了JQuery脚本外,下面的脚本也是必须的,这些脚本你都可以去GitHub下载:https://github.c ...

  2. vue 方法相互调用注意事项与详解

    vue在同一个组件内: methods中的一个方法调用methods中的另外一个方法: 可以直接这样调用:this.$options.methods.test(); this.$options.met ...

  3. JAVA揭竿而起总要有名号

    古代揭竿而起总要有个响亮的名号,这可不是随便的哦,比如  苍天已死,黄天当立... 玩JAVA里面形形色色的名字,都是有套路的,至于名字怎么起法,那得问问标识符 标识符 用作给变量.类和方法命名.注意 ...

  4. React--- react 初见React 总结

    简介 react 程序代码是透明的,需要什么装什么 代码实现逻辑清晰可见 第一天 React  基础构造 分别是  继承的 React.component(继承的依赖类)/dom(dom元素)/pro ...

  5. 利用MyFlash闪回丢失数据

          MyFlash is an open source tool released by Meituan-Dianping which can be used to flashback MyS ...

  6. python函数名应用

    函数名的应用 函数名 的应用分类: 函数就是一个特殊的变量(可以看成一个变量来用) *函数名对应函数的内存地址 *函数名可以做为容器类数据的元素 *函数名可以作为函数的参数 *函数名可以作为函数的返回 ...

  7. 谷歌浏览器添加flash白名单

    69以前的版本: 打开 chrome://settings/content/flash 上图中应该有一个"添加"选项 , 依次输入: *.]com [*.]net [*.]org ...

  8. PHP环境配置:Windows7+IIS7+PHP+MySQL - 适用于(2008 R2 / 8 / 10)

    配置需求 操作系统:Windows7(x32/x64), windows2008 IIS版本:7.0 PHP版本:7.0.6 及以上 MySQL版本:5.7.12 及以上 第一步:安装 IIS 注意: ...

  9. XSS攻击 && CSRF攻击 基础理解

    一个网站,不管多么的帅气,多么的风骚,如果你不安全,那始终都是一个弟弟啊~ 今天又看了下XSS和CSRF攻击的文章,我也想发点什么普及下大家的安全意识,毕竟作为一名拥有伟大梦想的程序员,基本的安全意识 ...

  10. animation(动画)设置

    1.animation 动画 概念:当您在 @keyframes 中创建动画时,请把它捆绑到某个选择器,否则不会产生动画效果. 通过规定至少以下两项 CSS3 动画属性,即可将动画绑定到选择器: 规定 ...