正則表達(dá)式

【摘】https://www.cnblogs.com/mq0036/p/6013225.html
RegExp:Regular Expression
正則-字符串
1、校驗(yàn)數(shù)據(jù) 2、提取數(shù)據(jù)

方式一構(gòu)造函數(shù)--JS風(fēng)格
var pattern=new RegExp('regexp','modifiers');
方式二字面量(推薦)--perl風(fēng)格
var pattern=/regexp/modifiers;

var pattern=new RegExp('abcd','g');
var pattern=/abcd/g;
/*modifiers(可以隨機(jī)組合使用):
i-不區(qū)分大小寫(xiě)
g-用于執(zhí)行全文的搜索
m-多行匹配*/

需要常規(guī)的字符轉(zhuǎn)義規(guī)則(在前面加反斜杠 \)

var patt1 = new RegExp('\\w', 'g'); // 有轉(zhuǎn)義作為正則表達(dá)式處理
var patt2 = new RegExp('\w', 'g');  // 無(wú)轉(zhuǎn)義作為字符串處理
var patt3 =/\w/g;  // 與 patt1 效果相同
自行體會(huì)eg:
new RegExp('\\w', 'g').test('abcd')//true
new RegExp('\w', 'g').test('abcd\w')//true
new RegExp('\w', 'g').test('abcd')//false
/\w/g.test('abcd')//true

常用方法
1、test()方法搜索字符串指定的值,根據(jù)結(jié)果并返回真或假。
pattern.test(str)

/*在非全局的情況下,
正則會(huì)根據(jù)指定的“規(guī)則”從左至右對(duì)字符串進(jìn)行匹配,
一旦規(guī)則匹配完,便會(huì)停止匹配操作,返回結(jié)果。*/
var pattern = /a/;
console.log(pattern.test('edcba')) // => true
/*在全局的的情況下,
正則會(huì)根據(jù)指定的“規(guī)則”從左至右對(duì)字符串進(jìn)行匹配,
一旦規(guī)則匹配完,便會(huì)在當(dāng)前字符串匹配位置重新使用“規(guī)則”繼續(xù)向下匹配,
一直到字符串匹配完成。*/
var pattern=/a/g;
pattern.test('abcd');//true
pattern.test('abcd');//false
pattern.test('abcd');//true
pattern.test('abcd');//false

2、exec() 方法檢索字符串中的指定值。返回值是被找到的值(返回一個(gè)數(shù)組)。如果沒(méi)有發(fā)現(xiàn)匹配,則返回 null。
pattern.exec(str);

/*在非全局的匹配模式下,一旦匹配到符合規(guī)則的結(jié)果,便會(huì)停止執(zhí)行。*/
var pattern=/a/;
pattern.exec('abcda');//["a", index: 0, input: "abcda", groups: undefined]
/*如果正則表達(dá)式?jīng)]有匹配到結(jié)果,那么返回的值就是 null。*/
var pattern=/a/g;
pattern.exec('abcda');//["a", index: 0, input: "abcda", groups: undefined]
pattern.exec('abcda');//["a", index: 4, input: "abcda", groups: undefined]
pattern.exec('abcda');//null
pattern.exec('abcda');//["a", index: 0, input: "abcda", groups: undefined]

思考題:如何找出重復(fù)最多的字符串?

var pattern=/(\w)\1+/g;
var len=0;
var data='',result='';
var str='abcababaaaccddcd';
str=str.split('').sort().join('');
while(result=pattern.exec(str)){
    if(result[0].length>len){
        len=result[0].length;
        data=RegExp.$1;
    }
}

3、replace()根據(jù)匹配規(guī)則pattern來(lái)用指定的內(nèi)容given去替換str或其部分字符,返回新字符串。
str.replace(pattern,given);
思考題:如何實(shí)現(xiàn)敏感詞過(guò)濾?

var str = '世界上最遙遠(yuǎn)的距離 不是生與死的距離 而是我就站在你的面前 你卻不知道我愛(ài)你。',
st = ['死','愛(ài)','距離'],
pattern = '',
alt = '';
for(var i=0;i<st.length;i++){
    pattern = new RegExp(st[i],'g');
    for(var j=0;j<st[i].length;j++){
          alt+='*';
    }
   str = str.replace(pattern,alt);
   alt = '';
}


var str="abcde123Abcd23abcde1234";
str.replace("a","*");//*bcde123Abcd23abcde1234
str.replace(/a/gi,"*");//*bcde123*bcd23*bcde1234

4、match()如果匹配成功則返回一個(gè)數(shù)組格式的結(jié)果用于存放匹配文本有關(guān)的信息,如果沒(méi)有匹配到則返回null
str.match(pattern)

var str = 'abcdabcda';
str.match(/a/);//["a", index: 0, input: "abcdabcda", groups: undefined]
/*如果match的匹配規(guī)則是一個(gè)正則,并且具有全局g屬性,
那么match返回的匹配結(jié)果,便是一個(gè)包含所有匹配結(jié)果的純數(shù)組。*/
var str = 'abcdabcda';
str.match(/a/g);//["a", "a", "a"]

match 匹配-結(jié)果數(shù)組

str="abcde123abcd23abcde1234";
re1=/\d/;
//["1", index: 5, input: "abcde123abcd23abcde1234", groups: undefined]
str.match(re1);

re1=/\d+/;
//["123", index: 5, input: "abcde123abcd23abcde1234", groups: undefined]
str.match(re1);

re1=/\d+/g;
//["123", "23", "1234"]
str.match(re1);

5、split()將字符串拆分為數(shù)組
str.split(pattern,length)

var str = 'hellow word!';
str.spilit(''); 
str.split('',5);
str.split(/\o/g);

6、search()該方法忽略全局修飾符g,一旦檢索到結(jié)果,便會(huì)停止檢索
如果檢索到則返回該結(jié)果首字母在原字符中的索引,否則返回-1。
str.search(pattern)
search 類(lèi)似于indexOf,返回位置

let str='cdteteaceteA';
str.indexOf('a');//6,返回位置,沒(méi)有就返回-1

let re=new RegExp('a');
str.search(re);//6,返回位置,沒(méi)有就返回-1

let re1=/a/;
str.search(re1);//6,返回位置,沒(méi)有就返回-1

正則常用語(yǔ)法

?:表示匹配0次或1次
+:表示匹配1次或多次
{n}:表示匹配n次
{n,m}:表示匹配n到m次
{n,}:表示至少匹配n次

^匹配字符串的開(kāi)始
$匹配字符串的結(jié)束
\b匹配單詞的開(kāi)始或結(jié)束
\B匹配不是單詞開(kāi)頭或結(jié)束的位置
\d匹配數(shù)字 等價(jià)于 [0-9]
\D匹配任意非數(shù)字的字符
\s匹配任意的空白符
\S匹配任意不是空白符的字符
\w匹配字母或數(shù)字或下劃線或漢字
\W匹配任意不是字母,數(shù)字,下劃線,漢字的字符

[abc]:只根據(jù)區(qū)間內(nèi)的內(nèi)容進(jìn)行匹配。
[a-zA-Z0-9]:匹配大小寫(xiě)字符a-z以及數(shù)組0-9的范圍
[^a-z]:取反匹配。匹配不在這個(gè)區(qū)間范圍內(nèi)的內(nèi)容

任意字符:/[^]/
漢字:/^[\u4e00-\u9fa5]+$/
手機(jī)號(hào)碼:/^1[3|4|5|7|8]\d{9}$/
郵政編碼:/[1-9]\d{5}/
電話(huà):\d{3}-\d{8}|\d{4}-\d{7}
身份證號(hào):/^\d{15}(\d{2}[A-Za-z0-9])?$/ 
整數(shù):/^[-\+]?\d+$/
浮點(diǎn)數(shù):/^[-\+]?\d+(\.\d+)?$/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容