JavaScript中的正则表达式

283 阅读3分钟

模式以及支持标志

var expression = / pattern / flags;

var 表达式 = / 模式 / 标志;

正则表达式的匹配模式支持下列3个标志。

修饰符描述
g(global)全局匹配,应用所有字符串,而非在发现第一个匹配后停止
i(ignoreCase)不区分大小写,匹配时忽略模式与字符串的大小写
m(multiline)多行匹配,到达一行文本末尾,继续查找下一行

两种创建方式

字面量定义和构造函数定义

	var expression = /[bc]at/i;//字面量定义
	var expression = new RegExp("[bc]at","i");//构造函数定义

RegExp构造函数接收两个参数:RegExp("要匹配的字符串模式","可选的标志字符串")

注意: 传递给RegExp构造函数的两个参数必须都是字符串

区别:

由于 RegExp 构造函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义

字面量模式构造函数模式
字面量和构造函数的区别

RegExp实例方法

test()

**接收:**一个字符串参数。

**返回值:**返回一个布尔值。

当模式与改参数匹配的情况下返回true,否则为false。

var example = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(example)){
    alert("The pattern was matched.");
}

exec()

exec() 接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;在没有匹配项的情况下返回 null 。返回的数组虽然是 Array 的实例,但包含两个额外的属性: index 和 input 。

  • index 表示匹配项在字符串中的位置。
  • input 表示应用正则表达式的字符串。

match()

match()方法可以以类似数组的形式返回第一个与表达式匹配的字符

例子:

	var reg = /ab/;
    var str = "abababababab";
   	console.log(str.match(reg));

match()方法

	var reg = /ab/g;
    var str = "abababababab";
   	console.log(str.match(reg));

match()全局匹配

方括号

  1. [........],查找方括号中的任意字符

比如: [abc]、[0-9]、[a-z]、[A-Z]、[A-z]、[adgk]

  1. [ ^......],查找方括号中 以外 的任意字符,^ 表示 ,注意这个 ^ 是要在[]里面的才表示

比如: [^abc]、[^adpk]

  1. (......|......|......) ,查找圆括号里面中的指定的其中一个,| 表示

比如: (abc|bcd|def)

元字符

字符等价类含义
.[^\r\n]除了回车符和换行符之外的所有字符
\d[0-9]数字字符
\D[^0-9]非数字字符
\s[\t\n\x0B\f\r]空白字符
\S[^\t\n\x0B\f\r]非空白字符
\w[a-zA-Z_0-9]单词字符(字母、数字下划线)
\W[^a-zA-Z_0-9]非单词字符

定位符

字符含义
^匹配字符串的开头
$匹配字符串的结尾
\b匹配一个单词的边界
\B与\b相反,匹配一个非单词边界

用例: \b边界符\B

量词

字符含义
n+匹配任何包含至少一个 n 的字符串
n*匹配任何包含零个或多个 n 的字符串
n?匹配任何包含零个或一个 n 的字符串
n{x}匹配包含 x 个 n 的序列的字符串
n{x,y}匹配包含 x 至 y 个 n 的序列的字符串
n{x,}匹配包含至少 x 个 n 的序列的字符串
x(?=n)匹配 x 字符串后紧接指定字符串 n 的字符串
x(?!n)匹配 x 字符串其后没有紧接指定字符串 n 的字符串
(?:n)匹配 n 字符串,但是不记住匹配项
(?<=y)x匹配'x'仅当'x'前面是'y'.这种叫做后行断言

具体细节可以查看:正则表达式

html特殊字符:

html特殊字符

练习题

  1. 将the-first-name转换成theFirstName?
        var reg = /-(\w)/g;
        var str = "the-first-name";
       	var newStr = str.replace(reg,function($,$1){
       		return $1.toUpperCase();
       	});
        console.log(newStr);
  1. 对数组去重?
	var str = "aaaaaaaaaaabbbbbbbbbcccccccc";
        var reg = /(\w)\1*/g;
        console.log(str.replace(reg,"$1"));
  1. 请将aaaaaabbbbbb的字符串调换成bbbbbbaaaaaa的形式?
        var reg = /(\w{6})(\w{6})/g;
        var str = "aaaaaabbbbbb";
        console.log(str.replace(reg,"$2$1"));
  1. 用**.**将str字符串从后向前3位3位截断?
    var reg = /(?=(\B)(\d{3})+$)/g;
    var str = "1000000000";
// 1、(\d{3})+ 匹配有三个数字的字符(默认从左边开始匹配)100000000
// 2、(\d{3})+$ 从最后匹配有三个数字的字符 000000000
// 3、(\B)(\d{3})+$ 从最后匹配有三个数字的字符,但每一个匹配到的字符的左边不是边界
// 4、?=n  匹配任何其后紧接指定字符串 n 的字符串 (?=(\B)(\d{3})+$)
    console.log(str.replace(reg,"."));
  1. 如何获取一个字符串中的数字字符,并以数组形式输出,如dgfhfgh234bhku259fakhdy678fh输出的是[234,259,678];
    var str = "dgfhfgh234bhku259fakhdy678fh";
    var newArr = str.match(/\d+/g).map(function(x){
            return +x;
        })
    console.log(newArr);
    //ES6做法

  1. 把字符串中的 -_@ 的后一个字母变成大写?
var str='background-color@good-morning_bad-afternoon@fine_thank';

var reg = /[-_@](\w)/g;
var newStr = str.replace(reg,function($,$1){
    return $1.toUpperCase();
});
console.log(newStr); // backgroundColorGoodMorningBadAfternoonFineThank
  1. 邮箱种类?
  • qq邮箱:130*****63@qq.com

  • 网易邮箱:pedestrian@163.com

  • outlook邮箱:pedestrian@outlook.com

  • 新浪邮箱:pedestrian@sina.cnpedestrian@sina.com

  • 雅虎邮箱:xxxx@yahoo.com.cn

    等等

    // 匹配邮箱的正则表达式:
    /^[a-zA-Z0-9_-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-z]{2,6}$/
    // 或者:
    /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/
    Juct_1919.tr_32@qq_132.net.com.cn
        
    

匹配整数:/(-?[1-9]\d*)|(0)/

匹配手机号码:/^1[34578]\d{9}$/

  1. 写一个function,清除字符串前后的空格。(兼容所有浏览器)

    function trim (str) {
        if (str && typeof str === 'string') {
            return str.replace(/^(\s*)|(\s*)$/g, "");
        }
    }