模式以及支持标志
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));
var reg = /ab/g;
var str = "abababababab";
console.log(str.match(reg));
方括号
- [........],查找方括号中的任意字符
比如: [abc]、[0-9]、[a-z]、[A-Z]、[A-z]、[adgk]
- [ ^......],查找方括号中 以外 的任意字符,^ 表示 非,注意这个 ^ 是要在[]里面的才表示 非
比如: [^abc]、[^adpk]
- (......|......|......) ,查找圆括号里面中的指定的其中一个,| 表示 或
比如: (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相反,匹配一个非单词边界 |
用例:
量词
字符 | 含义 |
---|---|
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特殊字符:
练习题
- 将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);
- 对数组去重?
var str = "aaaaaaaaaaabbbbbbbbbcccccccc";
var reg = /(\w)\1*/g;
console.log(str.replace(reg,"$1"));
- 请将aaaaaabbbbbb的字符串调换成bbbbbbaaaaaa的形式?
var reg = /(\w{6})(\w{6})/g;
var str = "aaaaaabbbbbb";
console.log(str.replace(reg,"$2$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,"."));
- 如何获取一个字符串中的数字字符,并以数组形式输出,如dgfhfgh234bhku259fakhdy678fh输出的是[234,259,678];
var str = "dgfhfgh234bhku259fakhdy678fh";
var newArr = str.match(/\d+/g).map(function(x){
return +x;
})
console.log(newArr);
//ES6做法
- 把字符串中的
-
和_
和@
的后一个字母变成大写?
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
- 邮箱种类?
-
qq邮箱:
130*****63@qq.com
-
网易邮箱:
pedestrian@163.com
-
outlook邮箱:
pedestrian@outlook.com
-
新浪邮箱:
pedestrian@sina.cn
或pedestrian@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}$/
-
写一个function,清除字符串前后的空格。(兼容所有浏览器)
function trim (str) { if (str && typeof str === 'string') { return str.replace(/^(\s*)|(\s*)$/g, ""); } }