成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JS正則表達(dá)式學(xué)習(xí)筆記1

wangdai / 592人閱讀

摘要:正則表達(dá)式作為前端學(xué)習(xí)的一個(gè)知識(shí)點(diǎn),是每個(gè)合格的前端開(kāi)發(fā)都應(yīng)該掌握它的用法。元字符一般情況下,正則表達(dá)式的一個(gè)字符對(duì)應(yīng)字符串的一個(gè)字符。

正則表達(dá)式作為前端學(xué)習(xí)的一個(gè)知識(shí)點(diǎn),是每個(gè)合格的前端開(kāi)發(fā)都應(yīng)該掌握它的用法。正則表達(dá)式的學(xué)習(xí)確實(shí)不難,語(yǔ)法和應(yīng)用也非常簡(jiǎn)單,能夠快速入門(mén),很輕松的就能寫(xiě)出簡(jiǎn)單的表達(dá)式來(lái)對(duì)字符串執(zhí)行某些操作。網(wǎng)上也有標(biāo)題黨說(shuō)一杯咖啡的時(shí)間就能學(xué)會(huì)。能學(xué)會(huì)嗎?能!但要真正的掌握卻不易,就好比籃球運(yùn)動(dòng),40分鐘的一節(jié)課,就能學(xué)會(huì)基本的規(guī)則和投球方法,但要做到非常優(yōu)秀,就需要長(zhǎng)時(shí)間的練習(xí),學(xué)習(xí)正則表達(dá)式也一樣,其實(shí),學(xué)習(xí)任何知識(shí)和技能都是如此,唯有長(zhǎng)時(shí)間的練習(xí),盡量避免少犯錯(cuò)誤,才能達(dá)到專(zhuān)業(yè);廢話說(shuō)了一籮筐,下面進(jìn)入正題;

在實(shí)際工作當(dāng)中,正則表達(dá)式應(yīng)用的場(chǎng)景有:

表單驗(yàn)證

驗(yàn)證郵箱

驗(yàn)證電話

是否為空

etc

替換字符串

檢索字符串

開(kāi)發(fā)工具當(dāng)中的查找和替換

簡(jiǎn)單來(lái)說(shuō),正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,用一些約定好的字符組合對(duì)字符串執(zhí)行檢索、匹配、替換等操作。

本文會(huì)把學(xué)習(xí)路徑分為兩個(gè)階段:

第一階段,熟悉正則,有一個(gè)正確的認(rèn)識(shí),能夠?qū)懗龊?jiǎn)單的正則表達(dá)式來(lái)操作字符串;

第二階段,熟練運(yùn)用正則的一些高級(jí)用法,掌握心法,需要時(shí),信手拈來(lái)。

第一階段

需要掌握的內(nèi)容包括:

如何定義一個(gè)正則表達(dá)式

定義了正則,在那些方法中使用

元字符

字符類(lèi)&字符轉(zhuǎn)義

范圍&量詞

分支條件

反義

如何定義一個(gè)正則表達(dá)式

有兩種方式:

通過(guò)實(shí)例化RegExp構(gòu)造函數(shù)

有兩個(gè)參數(shù),第一個(gè)是表達(dá)式,第二個(gè)是修飾符

使用字面量把正則寫(xiě)在兩個(gè)反斜杠中間

反斜杠中間是表達(dá)式,修飾符緊跟在最后一個(gè)/后面

DEMO

// 實(shí)例化RegExp類(lèi)定義
const reg = new RegExp("d","g");

// 字面量//定義
const reg = /d/g;

let str = "mmcai18is94a99boy";
let result = str.replace(reg," ")

console.log(str)
// 結(jié)果:mmcai18is94a99boy
console.log(result)
// 結(jié)果:mmcai is a body

// 字符串的replace方法不會(huì)修改原字符串,會(huì)返回一個(gè)新的字符串

修飾符

g:全文搜索,匹配到第一個(gè)就結(jié)束

i:忽略大小寫(xiě)

m:多行搜索

對(duì)象屬性

global:對(duì)象是否具有標(biāo)志g;結(jié)果是布爾值

ignoreCase:對(duì)象是否具有標(biāo)志i;結(jié)果是布爾值

lastIndex:一個(gè)整數(shù),標(biāo)識(shí)開(kāi)始下一次匹配的字符位置;結(jié)果是數(shù)字

multiline:對(duì)象是否具有標(biāo)志m;結(jié)果是布爾值

source:正則表達(dá)式的源文本;結(jié)果是字符串

let patt = /[a-z]d/gim;

patt.global = true;
patt.ignoreCase = true;
patt.multiline = true;
patt.source = "[a-z]d"
工作空間

其實(shí)這里想要表達(dá)的是正則表達(dá)式可以在那些方法上使用;

應(yīng)用場(chǎng)景可以分為兩種情況

正則對(duì)象本身具有的一些方法

test:檢索字符串中指定的值。返回true或false

exec:檢索字符串中指定的值。找到返回?cái)?shù)組,否則返回null

compile:改變正則表達(dá)式,不常用

一些字符串操作方法當(dāng)中

String.replace:替換與正則表達(dá)式匹配的字符串

String.search:檢索與正則表達(dá)式相匹配的值

String.split:把字符串分割為字符串?dāng)?shù)組

String.match:找到一個(gè)或多個(gè)正則表達(dá)式的匹配

DEMO

// test 判斷字符串是否符合我們定義的規(guī)則
// 表單驗(yàn)證的時(shí)候,可以使用test驗(yàn)證:手機(jī)號(hào),郵箱,身份證號(hào)碼,銀行卡等數(shù)據(jù)是否合法
let patt = /1[35789]d{9}/;
let str = "13588322792"
let flag = patt.test(str);
console.log(flag);

// exec 當(dāng)沒(méi)有全局修飾符的時(shí)候,函數(shù)的作用和match函數(shù)一樣,如果匹配到返回一個(gè)數(shù)組,否則返回null
// 把以下代碼放入編輯器,查看結(jié)果
var str="I love antzone ,this is animate";
var reg=/[a-z]{2}/;
var result = reg.exec(str);
console.log(result);

// result數(shù)組有至少兩個(gè)值,外加兩個(gè)屬性input和index
- result[0]:匹配的字符串
- result[1]:存放第一個(gè)分組匹配的值,否則為undefined
- result[2]:存放第二個(gè)分組匹配的值,否則沒(méi)有改項(xiàng)
- result[n]:存放第n個(gè)分組匹配的值,否則沒(méi)有該項(xiàng)
result.index = 匹配字符串的索引
result.input = 要匹配字符串完整的引用


// exec 有全局修飾符g的時(shí)候,此函數(shù)返回值同樣是一個(gè)數(shù)組,并且也只能夠在字符串中匹配一次。不過(guò)此時(shí),此函數(shù)一般會(huì)和lastIndex屬性匹配使用,此函數(shù)會(huì)在lastIndex屬性指定的字符處開(kāi)始檢索字符串,當(dāng)exec()找到與表達(dá)式相匹配的字符串時(shí),在匹配后,它將lastIndex 屬性設(shè)置為匹配字符串的最后一個(gè)字符的下一個(gè)位置??梢酝ㄟ^(guò)反復(fù)調(diào)用exec()函數(shù)遍歷字符串中的所有匹配,當(dāng)exec()函數(shù)再也找不到匹配的文本時(shí),它將返回null,并把lastIndex 屬性重置為0。
數(shù)組的內(nèi)容結(jié)構(gòu)和沒(méi)有g(shù)修飾符時(shí)完全相同。

var str="the name 123 and 456";
var reg=/d/g;
reg.lastIndex=15;
console.log(reg.exec(str));

String.search

search不執(zhí)行全局匹配,會(huì)忽略修飾符g。

如果匹配到,返回匹配值所在的索引,否則返回-1

var str="Visit W3School!"
var r = str.search(/w3school/);
console.log(r);

String.replace

返回一個(gè)新的字符串,是替換后得到的新值。

replace有兩個(gè)參數(shù):

第一個(gè)可以是字符串,也可以是正則表達(dá)式

第二個(gè)可以是字符串,也可是function

如果第二個(gè)是字符串,字符串中的$字符有特定的含義

字符 說(shuō)明
$1...$99 子表達(dá)式匹配的文本
$& 與regexp想匹配的字符串
$` 位于子匹配字符串左側(cè)的文本
$" 位于子表達(dá)式匹配內(nèi)容右側(cè)的文本
$$ 直接量符號(hào)
1.簡(jiǎn)單用法
var str="Visit Microsoft!"
var res = str.replace(/Microsoft/, "W3School");
console.log(res);

2.修飾符g,全局匹配
var str="Welcome to Microsoft! "
str=str + "We are proud to announce that Microsoft has "
str=str + "one of the largest Web Developers sites in the world."

var res = str.replace(/Microsoft/g, "W3School");
console.log(res);

3.修飾符i,忽略大小寫(xiě)
var text = "javascript Tutorial";
var res = text.replace(/javascript/i, "JavaScript");
console.log(res)

4.字符中的$
var name = "Doe, John";
var res =  name.replace(/(w+)s*, s*(w+)/, "$2 $1");
console.log(res)

5.
var name = ""a", "b"";
var res = name.replace(/"([^"]*)"/g, ""$1"");

6.第二個(gè)參數(shù)是函數(shù)
var name = "aaa bbb ccc";
var uw=name.replace(/w+/g, function(word){
  return word.substring(0,1).toUpperCase()+word.substring(1);}
);

String.match

匹配到就返回一個(gè)數(shù)組,數(shù)組結(jié)構(gòu)參考上面的exec方法,否則返回null

var str="Hello world!"
var res1 = str.match("world");
var res2 = str.match("World");
console.log(res1);
console.log(res2);


var str="1 plus 2 equal 3"
var res3 = str.match(/d+/g);
console.log(res3);

String.split

把字符串分割成字符串?dāng)?shù)組。

返回一個(gè)字符串?dāng)?shù)組。

1.
var str="How are you doing today?"
var res1 = str.split(" ");
var res2 = str.split("");
var res3 = str.split(" ",3);

2.
var words = str.split(/s+/)

3.
"hello".split("")
元字符

一般情況下,正則表達(dá)式的一個(gè)字符對(duì)應(yīng)字符串的一個(gè)字符。
如果我們想要匹配一類(lèi)的字符的時(shí)候,就可以通過(guò)元字符來(lái)處理,常用的元字符有:

代碼 說(shuō)明
. 匹配除換行符以外的任意字符
w 匹配字母或數(shù)字或下劃線或漢字
s 匹配任意的空白符(包括空格,制表符(Tab),換行符,中文全角空格等)
d 匹配數(shù)字
b 匹配單詞的開(kāi)始或結(jié)束
^ 匹配字符串的開(kāi)始
$ 匹配字符串的結(jié)束

DEMO

1.匹配前后都是空格的字符串
let reg = /w+/g;
let str = "my name is mmcai";
str.replace(reg,"xx");

2.修改時(shí)間格式2019 07 18為2019/07/18
let reg = /s/g;
let str = "2019 07 18";
str.replace(reg,"-");

3.匹配不是特殊符號(hào)的字符串
var str="Give 100%!";
var patt1=/w/g;

4.匹配以Is開(kāi)頭的字符串
var str="Is this his";
var patt1=/^Is/g;

5.對(duì)數(shù)字進(jìn)行全局搜索
var str="Give 100%!";
var patt1=/d/g;

6.對(duì)字符串結(jié)尾是is的進(jìn)行匹配
var str="Is this his";
var patt1=/is$/g;
字符類(lèi)&范圍類(lèi)&字符轉(zhuǎn)義

要想查找數(shù)字,字母或數(shù)字,空白我們可以根據(jù)上面一節(jié)提到的元字符來(lái)匹配。但是如果想匹配的字符集合沒(méi)有預(yù)定義的元字符集合,怎么辦?這時(shí)候我們就可以通過(guò)定義字符類(lèi)類(lèi)的形式進(jìn)行匹配。

例如

[.?!]——匹配表單符號(hào)(.或?或!)
[abc]——匹配字符a或b或c
[aeiou]——匹配任何一個(gè)英文元音字母

除了以上方式,我們還可以通過(guò)-來(lái)指定一個(gè)字符范圍。

例如

[0-9]——匹配0到9的任意數(shù)字,含義和 d 元字符一樣
[a-zA-Z]——匹配26個(gè)英文字符,大小寫(xiě)都行

特點(diǎn)

使用元字符[]來(lái)構(gòu)建一個(gè)簡(jiǎn)單的類(lèi)

使用-字符定義一個(gè)字符范圍

所謂類(lèi)就是符合某些特性的對(duì)象,一個(gè)泛指,不是指某個(gè)字符

DEMO

1.匹配開(kāi)頭是a或b或c緊跟一個(gè)數(shù)字的字符
var reg =/[abc]d/g;
var str = "a1b2c3d4";
str.replace(reg,"-");
// result = "---d4";

2.匹配a到h之間的字符
var str="Is this all there is?";
var patt1=/[a-h]/g;

字符轉(zhuǎn)義理解起來(lái)相對(duì)簡(jiǎn)單,所謂的轉(zhuǎn)義其實(shí)是轉(zhuǎn)義我們的元字符,有時(shí)候我們需要匹配那些元字符本身的字符串,
就可以通過(guò)在元字符前面添加來(lái)進(jìn)行轉(zhuǎn)義;

例如下面一些例子:

// 匹配元字符.
let reg = /./;

// 匹配元字符/
let reg = ///

//匹配元字符*
let reg = /*/

//匹配字符類(lèi)的[]
let reg = /[]/

// 匹配本身
let reg = //;
量詞

就是表示匹配的數(shù)量,我們可以通過(guò)一些限定符類(lèi)指定匹配重復(fù)的數(shù)量

代碼 說(shuō)明

| 重復(fù)0次或更多次

| 重復(fù)一次或更多次

? | 重復(fù)0次或一次
{n} | 重復(fù)n次
{n,} | 重復(fù)n次或更多次
{n,m} | 重復(fù)n到m次

DEMO

// 匹配window后面跟1個(gè)或多個(gè)數(shù)字的字符
let reg = /windowd+/;

// 匹配字符的第一個(gè)單詞
let reg = /^w+/

//匹配時(shí)間格式為YYYY-MM-DD的字符串
let reg = /d{4}(-d{2}){2}$/;
let str = "2019-07-18";

//為了 避免匹配到"2019-07-1234124"這樣的字符串,添加$結(jié)尾符號(hào)
reg.test(str)
分支條件

有時(shí)候我們匹配的時(shí)候,規(guī)則不是單一的,可能有多個(gè)規(guī)則,我們就可以通過(guò)分支條件來(lái)實(shí)現(xiàn)。

比如,我們想要匹配固定電話,有些是三位區(qū)號(hào),八位本地號(hào),有些是四位區(qū)號(hào),7位本地號(hào),我們就可以如下寫(xiě):

let reg = /0d{2}-d{8}|0d{3}-d{7}/

DEMO

1. 匹配IP
let reg = /^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)/
let str = "192.168.0.253";
reg.test(str);

// 必須添加^,否則會(huì)匹配315.168.0.254這樣的字段中的15.168.0.254這一段
反義

反義就是取相反,例如d是匹配數(shù)字,D就是匹配不是數(shù)字的字符,s匹配空白符字符,S匹配不是空白符的字符。
在字符類(lèi)中我們也可以使用^表示反義,1匹配除abc以外的字符,常見(jiàn)的反義代碼如下:

代碼 說(shuō)明
W 匹配任意不是字母、數(shù)字、下劃線、漢字的字符
S 匹配任意不是空白符的字符
D 匹配任意不是數(shù)字的字符
B 匹配不是單詞開(kāi)頭或結(jié)束位置的字符
2 匹配除x以外的任意字符
3 匹配除aeiou以外的任意字符

DEMO

參考匹配IP地址里面,是如何匹配.這個(gè)元字符的
  • abc ?

  • x ?

  • aeiou ?

  • 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105763.html

    相關(guān)文章

    • js正則達(dá)式學(xué)習(xí)筆記

      摘要:說(shuō)來(lái)慚愧,做前端快三年對(duì)于正則表達(dá)式的應(yīng)用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語(yǔ)法和規(guī)則,這次項(xiàng)目中多次用到了需要匹配替換的動(dòng)作,終于下定決心去研究一下了。 說(shuō)來(lái)慚愧,做前端快三年對(duì)于正則表達(dá)式的應(yīng)用還是很淺薄,大家都知道正則的速度基本上是最快的,但就是懶得去記那些語(yǔ)法和規(guī)則,這次項(xiàng)目中多次用到了需要匹配替換的動(dòng)作,終于下定決心去研究一下了。 實(shí)例化正則對(duì)...

      Towers 評(píng)論0 收藏0
    • js正則達(dá)式學(xué)習(xí)筆記

      摘要:分組小括號(hào)功能較多有三種功能,作用一,把單獨(dú)的項(xiàng)組合成子表達(dá)式。作用三,允許后面引用前面的表達(dá)式。如果這時(shí)的正則表達(dá)式是一個(gè)非全局的,那么和正則表達(dá)式方法拿到的結(jié)果相同。,也可以接受一個(gè)正則表達(dá)式作為參數(shù)。 正則表達(dá)式創(chuàng)建字面量創(chuàng)建,a = /abc/gim;構(gòu)造函數(shù)創(chuàng)建,a = new RegExp(abc,gim)正則表達(dá)式中的特殊字符,[...] 方括號(hào)中的任意字符[^...] ...

      superPershing 評(píng)論0 收藏0
    • JS正則達(dá)式學(xué)習(xí)筆記2

      摘要:第二階段該部分內(nèi)容是學(xué)習(xí)正則的第二篇內(nèi)容,點(diǎn)擊第一部分查看第一部分的內(nèi)容。 第二階段 該部分內(nèi)容是學(xué)習(xí)正則的第二篇內(nèi)容,點(diǎn)擊第一部分查看第一部分的內(nèi)容。 這部分學(xué)習(xí)的內(nèi)容包括: 分組 斷言 匹配模式(貪婪和懶惰) 分組 我們可以通過(guò)量詞匹配一個(gè)字符多次,但是如果我們想要匹配多個(gè)字符多次,就需要用到分組,比如下面一個(gè)例子 // 匹配字母和數(shù)字連續(xù)出現(xiàn)三次的字符 let str = a...

      Ajian 評(píng)論0 收藏0
    • 正則達(dá)式

      摘要:本文內(nèi)容共正則表達(dá)式火拼系列正則表達(dá)式回溯法原理學(xué)習(xí)正則表達(dá)式,是需要懂點(diǎn)兒匹配原理的。正則表達(dá)式迷你書(shū)問(wèn)世了讓幫你生成和解析參數(shù)字符串最全正則表達(dá)式總結(jié)驗(yàn)證號(hào)手機(jī)號(hào)中文郵編身份證地址等是正則表達(dá)式的縮寫(xiě),作用是對(duì)字符串執(zhí)行模式匹配。 JS 的正則表達(dá)式 正則表達(dá)式 一種幾乎可以在所有的程序設(shè)計(jì)語(yǔ)言里和所有的計(jì)算機(jī)平臺(tái)上使用的文字處理工具。它可以用來(lái)查找特定的信息(搜索),也可以用來(lái)查...

      bang590 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <