一、创建正则表达式
1.let regexp = new RegExp("pattern")
let regexp = /pattern/; // 没有修饰符
2.let regexp = /pattern/gmi; // 伴随修饰符
用法
let str = "I love JavaScript!"; // 将在这里搜索
let regexp = /love/;
alert( str.search(regexp) ); // 2
修饰符
- i 使用此修饰符后,搜索时不区分大小写:
A和a没有区别(具体看下面的例子)。 - g 使用此修饰符后,搜索时会查找所有的匹配项,而不只是第一个
- m 多行模式
- s 严格模式,允许点
.匹配换行符\n。也就是说匹配任何字符。 - u 开启完整的 unicode 支持。该修饰符能够修正对于代理对的处理。
- y 粘滞模式
二、字符类
1.数字匹配
let str = "+7(903)-123-45-67";
let regexp = /\d/;
alert( str.match(regexp) ); // 7
let regexp1 = /\d/g
alert( str.match(regexp1) ); //79031234567
总结:常用的字符匹配有
\d (“d” 来自 “digit”) 数字:从0到9的字符
\s (“s” 来自 “space”)空格符号:包括空格,制表符 \t,换行符 \n 和其他少数稀有字符,例如 \v,\f 和 \r。
\w (“w” 来自 “word”) 单字字符:拉丁字母或数字或下划线 _。非拉丁字母(如西里尔字母或印地文)不属于 \w。
2.正则表达式可能同时包含常规符号和字符类。
let str = "Is there CSS4?";
let regexp = /CSS\d/
alert( str.match(regexp) ); // CSS4
三、反向类
对于每个字符类,都有一个“反向类”,用相同的字母表示,但要以大写书写形式。
“反向”表示它与所有其他字符匹配,例如:
- \D 非数字:除
\d以外的任何字符,例如字母 - \S 非空格符号:除
\s以外的任何字符,例如字母。 - \W 非单字字符:除
\w以外的任何字符,例如非拉丁字母或空格。
let str = "+7(903)-123-45-67";
alert( str.replace(/\D/g, "") ); // 79031234567
注意:点 . 是一种特殊字符类,它与 “除换行符之外的任何字符” 匹配。
let regexp = /CS.4/;
alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (space is also a character)
//带有“s”标志时点字符类严格匹配任何字符
alert( "A\nB".match(/A.B/) ); // null (no match)
alert( "A\nB".match(/A.B/s) ); // A\nB (match!)
//[]代表字符组,表示符合里面其中的一个
alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (match!)
注意空格
alert( "1 - 5".match(/\d-\d/) ); // null, no match!
alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, now it works
// or we can use \s class:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, also works
四、Unicode:修饰符 “u”
1.Unicode:修饰符 “u”
我们可以查找具有某种属性的字符,写作 \p{…}。为了顺利使用 \p{…},一个正则表达式必须使用修饰符 u。
举个例子,\p{Letter} 表示任何语言中的一个字母。我们也可以使用 \p{L},因为 L 是 Letter 的一个别名(alias)。对于每种属性而言,几乎都存在对应的缩写别名。
更多的缩写别写详见 zh.javascript.info/regexp-unic…
// u unicode属性,匹配特殊的象形字母或者异国语言字母
let str = "A ბ ㄱ";
alert( str.match(/\p{L}/gu) ); // A,ბ,ㄱ
alert( str.match(/\p{L}/g) ); // null(没有匹配的文本,因为没有修饰符“u”)
2.匹配16进制数字
let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
alert("number: xAF".match(regexp)); // xAF
3.匹配中文字符
let regexp = /\p{sc=Han}/gu; // returns Chinese hieroglyphs
let str = `Hello Привет 你好 123_456`;
alert( str.match(regexp) ); // 你,好
4.匹配货币
let regexp = /\p{Sc}\d/gu;
let str = `Prices: $2, €1, ¥9`;
alert( str.match(regexp) ); // $2,€1,¥9
总结
修饰符 u 在正则表达式中提供对 Unicode 的支持。
这就意味着两件事
- 4 个字节长的字符被以正确的方式处理:被看成单个的字符,而不是 2 个 2 字节长的字符。
- Unicode 属性可以被用于查找中
\p{…}。
有了 unicode 属性我们可以查找给定语言中的词,特殊字符(引用,货币)等等。
五、锚点(Anchors):字符串开始 ^ 和末尾 $
插入符号 ^ 匹配文本开头,而美元符号 $ 则匹配文本末尾。
//举个例子,让我们测试一下文本是否以 Mary 开头
let str1 = "Mary had a little lamb";
alert( /^Mary/.test(str1) ); // true
//可以用 snow$ 来测试文本是否以 snow 结尾
let str1 = "it's fleece was white as snow";
alert( /snow$/.test(str1) ); // true
在以上这些具体的例子中我们实际上可以用 startsWith/endsWith 来代替。正则表达式应该被用于更加复杂的测试中。
1.测试完全匹配
这两个锚点 ^...$ 放在一起常常被用于测试一个字符串是否完全匹配一个模式。比如,测试用户的输入是否符合正确的格式。
let goodInput = "12:34";
let badInput = "12:345";
let regexp = /^\d\d:\d\d$/;
alert( regexp.test(goodInput) ); // true
alert( regexp.test(badInput) ); // false
注意
什么字符串可以匹配模式 ^$?
/^$/.test("") //true
\