正则表达式
正则表达式(Regular Expression),在代码中使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
正则的编写
在js中,正则常用//来表示(如下、用于匹配字符abc的正则编写)
var regex = /abc/;
匹配符
符号 | 语义 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
| | 竖线符号在正则中表示 ‘或关系’ , 即匹配其中之一即可 |
\ | 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。在java中则\\代表转义符 |
. | 匹配任意一字符 |
如上所述.可以匹配任意一个字符,但我们要单单匹配符号.呢? 那就使用\来进行下转义。也就是\.来匹配
量词
当我们对某一块字符要匹配多次的时候,就用到量词
符号 | 语义 |
* | 匹配前一个表达式 0 次或多次。等价于 {0,} |
+ | 匹配前面一个表达式 1 次或者多次。等价于 {1,} |
? | 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1} |
贪婪模式
如果**?紧跟在任何量词 * + ? 或 {} 的后面**,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 “123abc” 使用 /\d+/ 将会匹配 “123”,而使用 /\d+?/ 则只会匹配到 “1”。
使用
// 匹配任意个a字符
var re = /a*/;
// 匹配一个及以上的a字符
var re = /a+/;
// 匹配零个或者一个a字符
var re = /a?/;
// 匹配3个到6个a字符
var re = /a{3,6}/;
括号
符号 | 语义 |
() | 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串 |
[] | 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字 |
{} | 一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格 |
使用
// 匹配ip:port。=>类似于127.0.0.1:80。当然如下的正则还有些问题,如可以大于255等
var re = /\d{1,3}(.\d{1,3}){3}:\d+/;
// 匹配a-z中的任意一字符
var re = /[a-z]/;
通过标志进行高级搜索
标志 | 描述 |
g | 全局搜索 |
i | 不区分大小写搜索 |
m | 多行搜索 |
s | 允许 . 匹配换行符 |
u | 使用unicode码的模式进行匹配 |
y | 执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始 |
使用
加在正则双斜杆后
// 匹配一串字符串中任意位置的a
var re = /a/g;
正则的使用
lastIndex 下一次匹配开始的位置
RegExp.prototype.test()
用于检测一个字符串是否匹配某个模式。如果字符串中有匹配的值返回 true ,否则返回 false。
var regexp = /abcd/g;
var str = 'abcdefg';
console.log(regexp.lastIndex,regexp.test(str),regexp.lastIndex);
RegExp.prototype.exec()
用于检索字符串中的正则表达式的匹配。如果字符串中有匹配的值返回该匹配值,否则返回 null。
re2 = /a(b)(c)/g; // 全局匹配
while (r2 = re2.exec("abcafdabcvdafdacvabcbcbcaacabc")) {
console.log(r2, re2.lastIndex);
}
str.match(regexp)
可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g
var str = 'For moreinformation, see Chapter 3.4.5.1 or seeChapter 3.4.2.1';
var re = /see (chapter \d+(\.\d)*)/i; // 没有使用g标志 有两个捕获括号
var found = str.match(re);
console.log(found);
str.search()
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。如果没有找到任何匹配的子串,则返回 -1。
var str = "Mr. Blue has a blue house";
console.log(str.search("blue")); // 15
var re = /a/;
console.log(str.search(a)); // 10
str.replace()
返回一个由替换值替换部分或所有的模式(pattern)匹配项后的新字符串。第一个参数可以是一个字符串或者一个正则表达式,第二个参数替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr); // Smith, John
上面的例子中replace的第二个参数,也就是替换值是一个字符串,并且字符串中有特殊的变量,$1表示的是第一个捕获括号匹配到的值(John),$2表示的是第二个捕获括号匹配到的值(Smith)。