资讯专栏INFORMATION COLUMN

JavaScript_正则

pumpkin9 / 1247人阅读

摘要:主要目的是想要中间那一块除了之外的都可行,取的补集中间部分纯文字,不含大于号,和小于号。匹配为例匹配到的数组,第个单元,代表整个正则表达式的匹配结果则代表第个子表达式匹配的结果。

正则应用

正则表达式在web开发中的常用

邮箱验证
用户名验证
替换字符串某一部分
信息采集,用来分析有效代码段
...

有规律的字符串描述

正则表达式是一门独立的知识,同样的一段描述,比如,对于email的匹配表达式,在不同的语言是一样的,但是调用的函数不同。

正则表达式--规则表达式

正则表达式:正则表达式
正则表达式语法:正则表达式语法
正则表达式语言:正则表达式语言

准备性的工作

在js中,如何写正则表达式。 /RegExp/

在js里,用正则表达式来验证字符串是否满足, 使用 reg.test(str);

用正则表达式的exec函数,用来查找匹配的选项,并把查找的值取出。

reg.test(str); 返回true 或者false 。 常在表单验证中使用。


    

请输入姓名:

请输入年龄:

exec(); 返回 数组 或 null。
exec是英语execute的意思,CEO首席执行官,E就是executive执行的
“执行” 把正则式放到字符串上执行
每次执行结果按序输出,不管结果有几个,一次只输出一个 ,如果多次输出,会保持前面的引用。当匹配超过原字符串的时候,会返回null。然后遇到null,指针返回到匹配的字符的第一位。 具有迭代器的感觉。

var str = "ABCDEFG1234567abcdefg";
var reg = /[a-z]/g;
console.log( a=/[a-z]/g.exec(str) );
var a;
while( a=reg.exec(str) ){  //这边 null 为 fasle。 exec() 会保持对前面一次的引用。 需要使用 值来赋值。
    console.log( a );
}

使用exec() 找最大子串

var str = "AAABBBCCCCCCC";
var reg = /(w)1+/g;
var maxLength = 0;
var maxLetter = "";
var a;
while( a=reg.exec(str) ){
    if( a[0].length>maxLength ){
        maxLength = a[0].length;
        maxLetter = a[0];
    }
}
console.log( maxLetter );

var str="BCDEFG1234567abcdefg";
var reg = /[a-z]/g;
var a;
while( (a=reg.exec(str)) != null ){  //先赋值给a,然后再与后边判断。
    console.log( a );
}

str.match( reg ); //查找,匹配到,返回数组
str.split( reg ); //拆分,返回数组
str.serch( reg ); //查找位置
str.replace( reg,"new str"); //正则替换,返回string

    
//测试是否含有hi
var reg = /hi/; //仅看字符串是否有 hi
console.log( reg.test("hello") ); //fasle
console.log( reg.test("this is iqianduan") ); //true
//测试单词 hi
var reg01 = /hi/;
console.log( reg01.test("this is") ); //false
console.log( reg01.test("this is, hi,his") );//true
正则表达式 3 句话

要找什么字符?
从哪儿找?
找几个?

要找什么字符

字面值, ‘hi’ ,就是找‘hi’。

用字符的集合来表示 , [abcd], 指匹配abcd中任意一个

//找不吉利的数字
//3,4,7
var reg = /[3,4,7]/; //字符集合, 不能使用 /347/ 字面值表示,是表示整体。 
console.log( reg.test("12121212") );//false
console.log( reg.test("12341234") ); //true    

用范围表示字符 , [0-9] [0123456789] [a-z] [A-Z]

// var reg = /[0123456789]/;
var reg = /[0-9]/;
console.log( reg.test("123afsdf") ); //true
console.log( reg.test("asdf") ); //false
//是否有大写字母
var reg = /[A-Z]/;
console.log( reg.test("asdf") );//false
console.log( reg.test("Tomorrow is another day") ); //true  

字符簇, 花团锦簇-> 一坨字符。

系统为常用的字符集合,创建的简写.
例如:

[0-9] --> d

[0-9a-zA-Z_] --> w .. 域名,注册用户名常用的模式.

[ vf ] --> s 空白符.

//是否含有数字
var reg = /d/;
console.log( reg.test("123afsdf") ); //true
console.log( reg.test("asdf") ); //false

补集的形式来表示字符集合 在集合前面使用表示补集。

[0-9]---> [^0-9] ^ 脱字符号: 念法: caret。["kærət] 。

[abcdef]-->[^abcdef]

//验证全为数字
var reg = /^[0-9]/; //匹配非数字
// var reg = /^d/ //字符簇补集
console.log( reg.test("aaaaa") );//非数字存在 false
console.log( reg.test("123aaa") ); //有数字存在 true

字符簇的补集:

d -- > D(非数字)

s --> S(非空白字符)

w --> W

任意字符 : . 唯独不包括换行符

从哪儿找,找到哪儿

b 单词边界

/bhi/ --> 从单词的边界开始匹配hi。

// 匹配单词hi,包括hi本身
// var reg = /hi.+/;//错误
// var reg = /hiw+/;  //错误。 + --> 至少有 一个
var reg = /hiw*/; 
console.log( reg.exec("this is") ); //null
console.log( reg.exec("his") ); //["his", index: 0, input: "his"]
console.log( reg.exec("history") ); //["history", index: 0, input: "history,hi"]
//匹配进行时的结尾
var reg = /[a-zA-Z]+ing/;
console.log( reg.exec("going") );//["going", index: 0, input: "going"]
console.log( reg.exec("1ting.com") );//null
console.log( reg.exec("ing") );//null   //2 -> to  4->for  0->zero  
//匹配un前缀的反义词
//unhappy  happy,hungry,sun,unhappy
var reg = /un[w]+/;
console.log( reg.exec("happy,hungry,sun,unhappy") ); //["unhappy", index: 17, input: "happy,hungry,sun
,unhappy"]

B 单词的非边界

// 把单词中间的某一个部分取出来。
        // 把中间含有hi的单词取出,即hi不能在两端。
var reg = /BhiB/;
console.log( reg.exec("this") ); //["hi", index: 1, input: "this"]
console.log( reg.exec("hi") ); //null

^ creat , 从字符串的起始位置开始匹配

$ 匹配到字符串的结束位置

从字符串的开头到结尾开始匹配,模拟运行顺序.

var reg = /^lishi$/;     
console.log( reg.exec("lishinihao") ); null
console.log( reg.exec("lishi") );  //["lisi", index: 0, input: "lisi"]
找多少

*, [0,n] --> {0, }
+ , [1,n] -->{1, }
? , [0,1] -->{0,1}
n {n} {3} a{n} , 字符a准确的出现n次
a{n,} 字符a,至少出现n次。
a{n,m} 字符串a,出现n到m次。

模式

以匹配为例,默认情况下,找到一次结果符合就结束。
告知匹配过程,一直找,在全文范围内一直找。
g -> 全局模式, global 找所有的,而不是找一次就结束
i -> 忽略大小写,ignore

//查找所有中间含有hi的单词
var reg = /BhiB/gi;
var str = "shit,hi,this,thit,THIS";
console.log( str.match(reg) );  //["hi", "hi", "hi", "HI"]

确定边界是什么,那些东西必须有,那些东西可能有可能没有。配合+,*

//把链接换成 #
//  --> 
//1,不能保留链接的文字(反向引用)
//2,不能跨行(贪婪模式)
var reg = //g;
var str = "";
console.log( str.replace(reg,"文字") );  

js不支持单行模式。

//s   单行模式:把整个字符串看成一行

.  代表任意,但不包括换行。


在js里,不支持当行模式的情况下,如何换行?

什么样的模式能代表“所有” 字符串
sS 全部字符 使用一个技巧, 一个集合加补集,就是全集
[dD] [sS] [wW]

var reg = //g;
var str = ""+    
    "";
console.log( str.replace(reg,"文字") );

//s  多行模式:碰到一行就把当前的当成一个字符串来解析
//把每一行的结尾的数字换成 #
//车牌号
//Cx003
//A0008
//B3456
var str = "Cx003"+
"A0008"+
"B3456";
var reg = /d+$/gm;
console.log( str.replace(reg,"#") );
贪婪模式

贪婪模式

如果"?"紧跟在在任何量词*, + , ?,或者是{}的后面,将会使量词变成非贪婪模式(匹配最少的次数),和默认的贪婪模式(匹配最多的次数)正好相反。
比如,使用/d+/非全局的匹配“123abc”将会返回“123”,如果使用/d+?/,那么就只会匹配到“1”。

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

任何量词后面 跟 ? 代表非贪婪模式 , 满足条件就不找了,小富即安,打完收工。 修饰个数,尽量少找和多找的。

//goooooooooods  --> goods
var str = "goooooooooods,goooods,goooood,gooooo,gooooods";
var reg = /g[o]{3,}?ds/g;
console.log( str.replace(reg,"goods") ); //goods,goods,goooood,gooooo,goods    


欲查 正向欲查

欲查不消耗字符。

//查找进行时的单词的词根, 即 不要ing 。  going -> go
var str = "going,comming,fly";
// var reg = /[a-zA-Z]+ing/g;
var reg = /[w]+(?=ing)/g; // 类似探照灯,先去判断几位是否满足,满足返回,不满足继续下一位.
console.log( str.match(reg) );  

满足 ing ,找到com。

不满足接着走。 看见不满足条件,并不会一次性调到ing后面接下去寻找,而是从该处光标继续寻找。
已经查找的词是消耗了,下次从该处光标开始寻找。

//查找进行时的单词的词根, 即 不要ing 。  going -> go
var str = "going,comming,fly";
// var reg = /[a-zA-Z]+ing/g;
// var reg = /[a-zA-Z]+(?=ing)/g; //结尾 是错误的, 欲查不消耗字符, 相当于/[a-zA-Z]+/ 这种形式
var reg = /[a-zA-Z]+(?=ing)/g; // 类似探照灯,先去判断几位是否满足,满足返回,不满足继续下一位.
console.log( str.match(reg) );  // ["go", "comm"]  

 
负向欲查

不是谁才行。 往后看一定位数,不是谁才可以。 不要后面是某某某的东西。

//查找win98,win95,win32,win2003,winxp   -->win98,win32,win2003,winxp
var str = "win98,win95,win32,win2003,winxp";
var reg = /win(?!95)/g;
console.log( str.match(reg) ); // ["win", "win", "win", "win"]

js不支持,向前正向欲查,向前负向欲查:

//找出 un系列单词的词根
var reg = /[w]+(?<=un)/g;
var str = "unhappy";
console.log(str.match(reg));  //报错
var reg = /[w]+(?
反向引用

反向引用,也叫后向引用。或者分组或子表达式

一般是整个表达式, 但是中间的部分 有特殊做了描述。 需要的部分特殊处理。使用分组,叫做子表达式。

//把链接换成空连接,保持文字信息。
    var str = "阴天快乐";
    var reg = /]+>([^<>]+)/;  //超链接的表达式
    console.log( reg.exec(str) );  //["阴天快乐", "阴天快乐", index: 0
, input: "阴天快乐"]  //能够把子表达式的东西匹配出来。
    // console.log( str.replacte(reg,"#") );
    /**
      ]>([^<>]+)    主要目的是想要中间那一块
      除了>之外的都可行 , 取> 的补集 [^>]
      中间部分纯文字,不含大于号,和小于号。 取小于号和大于号的补集 [^<>]+   / [sS]+
    */
    //一般是整个表达式, 但是中间的部分 有特殊做了描述。 需要的部分特殊处理。使用分组,叫做子表达式。
    //匹配html
    //   /]*)?>[sS]*/
    /*exec为例:
      匹配到的数组,第0个单元,代表"整个正则表达式的匹配结果"
      1,2,3,4....N,则代表第N个子表达式匹配的结果。  //js顶多有9个子表达式。 // ["阴天快乐", "阴天快乐", index: 0, input: "阴天快乐"]
    */
    console.log( str.replace(reg,"$1") ); //阴天快乐
    
    var str = "";
    var reg = /]*)?>[sS]*/;
    console.log( reg.exec(str) );
    str.replace(reg,function( $1,$2 ){
      console.dirxml($2); //html
    });
    

如何引用子表达式所匹配的结果?

在正则外边使用:$N 来匹配 第N个子表达式的匹配结果。

在正则里边使用N来 使用第N个子表达式。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79885.html

相关文章

  • JavaScript中登录名的正则表达式及解析(0基础)

    摘要:简言在中,经常会用到正则表达式来进行模式匹配。要写出正确的正则表达式,先要定义表达式规则。重复在正则表达式中用来表示元素重复出现的次数。给出测试结果如下毛三胖子测试代码根据以上内容,定义你自己的登录名正则表达式吧原文链接 简言 在JavaScript中,经常会用到正则表达式来进行模式匹配。例如,登录名验证,密码强度验证,字符串查找或替换等操作。现在就开始吧,零基础写出你的第一个正则表达...

    JeOam 评论0 收藏0
  • 正则表达式

    摘要:当我们指定标志后,每次运行,正则表达式本身会更新属性,表示上次匹配到的最后索引使用全局匹配,直到结束仍没有匹配到全局匹配类似搜索,因此不能使用,那样只会最多匹配一次。正则表达式还可以指定标志,表示忽略大小写,标志,表示执行多行匹配。 如果有对字符串进行匹配的需求。自然会想到用正则如 号码:010-8123123 var reg = /^d{3}-d{7}$/ or var reg = ...

    Leck1e 评论0 收藏0
  • 【收藏】15个常用的javaScript正则表达式

    摘要:用户名正则用户名正则,到位字母,数字,下划线,减号输出密码强度正则密码强度正则,最少位,包括至少个大写字母,个小写字母,个数字,个特殊字符输出整数正则正整数正则负整数正则整数正则输出输出输出数字正则可以是整数也可以是浮点 1 用户名正则 //用户名正则,4到16位(字母,数字,下划线,减号) var uPattern = /^[a-zA-Z0-9_-]{4,16}$/; //输出 tr...

    MarvinZhang 评论0 收藏0
  • JavaScript正则表达式

    摘要:对象对象对象表示正则表达式,它是对字符串执行模式匹配的强大工具。查找以十六进制数规定的字符。支持正则表达式的对象的方法方法描述检索与正则表达式相匹配的值。替换与正则表达式匹配的子串。 RegExp对象 RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。 直接量语法 /pattern/attributes 创建 RegExp 对象的语法 new R...

    894974231 评论0 收藏0
  • javascript高级特性

    摘要:人手腿嘴大手长腿欧巴樱桃小嘴我们知道造人是一个整体不可能先造手再造腿最后造嘴,我们现在的需求是一旦实例化人这个对象,该有的都有了。简单修改以上代码大手长腿欧巴樱桃小嘴调用函数我们在每个中添加了将原有对象返回避免无返回值的函数执行完之后是。 高级javascript函数 js中没有class的概念,我们可以使用function来模拟。 惰性载入函数 例如我们通常使用以下的js代码创建aj...

    Ryan_Li 评论0 收藏0
  • 你不知道的 javascript正则表达式

    摘要:正则表达式是用于匹配字符串中字符组合的模式。在中,正则表达式也是对象。注意如果正则表达式设置了全局匹配标志,和的执行会改变正则表达式属性。显示显示方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的...

    MangoGoing 评论0 收藏0

发表评论

0条评论

pumpkin9

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<