正则表达式

2018-11-04  本文已影响0人  爱笑的疯小妞

【摘】https://www.cnblogs.com/mq0036/p/6013225.html
RegExp:Regular Expression
正则-字符串
1、校验数据 2、提取数据

方式一构造函数--JS风格
var pattern=new RegExp('regexp','modifiers');
方式二字面量(推荐)--perl风格
var pattern=/regexp/modifiers;

var pattern=new RegExp('abcd','g');
var pattern=/abcd/g;
/*modifiers(可以随机组合使用):
i-不区分大小写
g-用于执行全文的搜索
m-多行匹配*/

需要常规的字符转义规则(在前面加反斜杠 \)

var patt1 = new RegExp('\\w', 'g'); // 有转义作为正则表达式处理
var patt2 = new RegExp('\w', 'g');  // 无转义作为字符串处理
var patt3 =/\w/g;  // 与 patt1 效果相同
自行体会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()方法搜索字符串指定的值,根据结果并返回真或假。
pattern.test(str)

/*在非全局的情况下,
正则会根据指定的“规则”从左至右对字符串进行匹配,
一旦规则匹配完,便会停止匹配操作,返回结果。*/
var pattern = /a/;
console.log(pattern.test('edcba')) // => true
/*在全局的的情况下,
正则会根据指定的“规则”从左至右对字符串进行匹配,
一旦规则匹配完,便会在当前字符串匹配位置重新使用“规则”继续向下匹配,
一直到字符串匹配完成。*/
var pattern=/a/g;
pattern.test('abcd');//true
pattern.test('abcd');//false
pattern.test('abcd');//true
pattern.test('abcd');//false

2、exec() 方法检索字符串中的指定值。返回值是被找到的值(返回一个数组)。如果没有发现匹配,则返回 null。
pattern.exec(str);

/*在非全局的匹配模式下,一旦匹配到符合规则的结果,便会停止执行。*/
var pattern=/a/;
pattern.exec('abcda');//["a", index: 0, input: "abcda", groups: undefined]
/*如果正则表达式没有匹配到结果,那么返回的值就是 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]

思考题:如何找出重复最多的字符串?

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()根据匹配规则pattern来用指定的内容given去替换str或其部分字符,返回新字符串。
str.replace(pattern,given);
思考题:如何实现敏感词过滤?

var str = '世界上最遥远的距离 不是生与死的距离 而是我就站在你的面前 你却不知道我爱你。',
st = ['死','爱','距离'],
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()如果匹配成功则返回一个数组格式的结果用于存放匹配文本有关的信息,如果没有匹配到则返回null
str.match(pattern)

var str = 'abcdabcda';
str.match(/a/);//["a", index: 0, input: "abcdabcda", groups: undefined]
/*如果match的匹配规则是一个正则,并且具有全局g属性,
那么match返回的匹配结果,便是一个包含所有匹配结果的纯数组。*/
var str = 'abcdabcda';
str.match(/a/g);//["a", "a", "a"]

match 匹配-结果数组

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()将字符串拆分为数组
str.split(pattern,length)

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

6、search()该方法忽略全局修饰符g,一旦检索到结果,便会停止检索
如果检索到则返回该结果首字母在原字符中的索引,否则返回-1。
str.search(pattern)
search 类似于indexOf,返回位置

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

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

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

正则常用语法

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

^匹配字符串的开始
$匹配字符串的结束
\b匹配单词的开始或结束
\B匹配不是单词开头或结束的位置
\d匹配数字 等价于 [0-9]
\D匹配任意非数字的字符
\s匹配任意的空白符
\S匹配任意不是空白符的字符
\w匹配字母或数字或下划线或汉字
\W匹配任意不是字母,数字,下划线,汉字的字符

[abc]:只根据区间内的内容进行匹配。
[a-zA-Z0-9]:匹配大小写字符a-z以及数组0-9的范围
[^a-z]:取反匹配。匹配不在这个区间范围内的内容

任意字符:/[^]/
汉字:/^[\u4e00-\u9fa5]+$/
手机号码:/^1[3|4|5|7|8]\d{9}$/
邮政编码:/[1-9]\d{5}/
电话:\d{3}-\d{8}|\d{4}-\d{7}
身份证号:/^\d{15}(\d{2}[A-Za-z0-9])?$/ 
整数:/^[-\+]?\d+$/
浮点数:/^[-\+]?\d+(\.\d+)?$/
上一篇下一篇

猜你喜欢

热点阅读