正则小结一(限定符)

建立一个Regexp的两种方式:

  1. var reg = /regexp/
  2. var reg = new RegExp('regexp')
  3. 能够配合使用的3个标志:
  • i : i可使正则表达式在匹配时忽略大小写。/regexp/i
  • g : g标志可使正则表达式匹配模式的全部实例。
  • m : 可使正则表达式跨多行(例如textarea元素的值)进行匹配。 以上这些标志都要放在表达式的尾部(/regexp/ig),或者做为第二个参数传进去(new RegExp('regexp', 'ig'))。
//下面的例子演示了各类标志的用法,以及它们是如何影响模式匹配的:

var pattern = /orange/; 
console.log(pattern.test("orange")); // true

var patternIgnoreCase = /orange/i;
console.log(patternIgnoreCase.test("Orange")); // true

var patternGlobal = /orange/ig;
console.log(patternGlobal.test("Orange Juice")); // true
复制代码

严格匹配模式

任何非正则表达式字符或操做符的字符序列,表明的都是该字符自己:
var parttern = /orange/;
咱们不多采用严格匹配,由于这和直接比较两个字符串没什么分别。严格匹配有时候也 叫做简化模式(simple pattern)。正则表达式

匹配字符组

若是想匹配一组字符,能够放到[]中来。例如[abc]就表示a,b,c中的任意一个字符。数组

var pattern = /[abc]/;
console.log(pattern.test('a')); //true
console.log(pattern.test('d')); //false
复制代码

也能够在模式开头加一个^(脱字符)来表示不想匹配到的内容。浏览器

var pattern = /[^abc]/;
console.log(pattern.test('a')); //false
console.log(pattern.test('d')); //true
复制代码

这种模式还有另外一种很重要的用法是用来指明值的范围。若是想匹配字符或数字的某个连续 范围,可使用下面的模式:bash

var pattern = /[0-5]/;
console.log(pattern.test(3)); //true 
console.log(pattern.test(12345)); //true 
console.log(pattern.test(9)); //false 
console.log(pattern.test(6789)); //false 
console.log(/[0123456789]/.test("This is year 2015")); //true
复制代码

咱们能够看到:[ , ] , ^ , $ , .等字符都是具备特殊含义的字符。那要配配它们的字面量的含义,要怎么作?
加一个\(反斜线字符)就行了。[ 匹配的就是一个普通的字符[, 而不是字符组的开括号。双\\表示一个普通的字符 \ 。函数

补充:^的两种含义:

能够运用到开发中的:exec() 和 match() 和 replace()方法

  1. 在正则中有exec()方法,以下示例:

  1. String对象的方法中有match()方法,以下示例:

能够看到两种方法结果是一致的。查找不到的时候则返回null。学习

  1. String对象的方法replace()方法实现字符的替换:
var strToMatch = 'Blue is your favorite color ? blue?'; 
var regExAt = /Blue/ig; 
console.log(strToMatch.replace(regExAt, "Red"));
//输出:Red is your favorite color ? Red?
复制代码

或者,第二个参数接受一个函数:ui

var strToMatch = 'Blue is your favorite color ?';
var regExAt = /Blue/;
console.log(strToMatch.replace(regExAt, function(matchingText){
  return 'Red';
}));
// 输出"Red is your favorite color ?"
复制代码
  1. String对象的split()方法也能够接受正则表达式做为参数并返回一个数组,该数组中包含 了通过分割后的全部子串:
var sColor = 'sun,moon,Stars';
var reComma = /[n,s]/i; 
console.log(sColor.split(reComma));
//输出: ["", "u", "", "moo", "", "", "tar", ""]
复制代码
  1. 使用简单字符组就能够匹配多个模式。假如想匹配cat、bat和fat,下面的代码片断展现了 具体的作法:
var strToMatch = 'wooden bat, smelly Cat,a fat cat';
var re = /[bcf]at/gi;
var arrMatches = strToMatch.match(re);
console.log(arrMatches);
//输出:["bat", "Cat", "fat", "cat"]
复制代码
  1. 如你所见,这种用法能够写出更简洁的正则表达式。来看下面的例子:
var strToMatch = 'i1,i2,i3,i4,i5,i6,i7,i8,i9';
var re = /i[0-5]/gi;
var arrMatches = strToMatch.match(re);
console.log(arrMatches);
//输出:["i1", "i2", "i3", "i4", "i5"]
复制代码

快捷写法:

写法 含义
\d 任意的单个数字字符
\w 任意的单个字母或数字字符
\s 任意的单个空白字符(空格、制表符、换行符等)
\D 任意的单个非数字字符
\W 任意的单个非字母或数字字符
\s 任意的单个非空白字符
. 除换行符以外的任意单个字符
  1. 这些快捷写法是书写简洁的正则表达式的关键。看下面的例子:
var strToMatch = '123-456-7890';
var re = /\d\d\d-\d\d\d/;
var arrMatches = strToMatch.match(re);
console.log(arrMatches);
//["123-456"]
复制代码
  1. 解决重复出现的重复限定符:
写法 含义
? 出现0次或1次(将模式视为可选的)
* 出现0次或屡次
+ 出现1次或屡次
{n} 只出现n次
{n,m} 出现n到m次
{n, } 至少出现n次
{ ,n} 出现0到n次
  1. \b(边界匹配符)的用法:一边是单词字符(字母、数字或下划线),另外一边是 非单词字符。
    下面的例子是一个简单的字面匹配。若是cat是一个子串的话,也可以成功匹配:
//非子串:
console.log(/cat/.test('a black cat')); //true

//子串:
console.log(/cat/.test('a blackcat')); //true
复制代码

下面是使用了 \b 之后的例子:this

//非子串:
console.log(/\bcat/.test('a black cat')); //true

//子串:
console.log(/\bcat/.test('a blackcat')); //false
console.log(/\bcat/.test('a cataa')); //true
console.log(/\bcat\b/.test('a blackcat')); //false
console.log(/\bcat\b/.test('a cat')); //true
复制代码

** \b 做用:** 上面的解释仍是有点模糊,\b表示的是字符与字符之间看不见的东西(空格)。
若是想匹配cat字符串的话,须要写成:/\bcat\b/
详细解释看下图:spa

exec的用法:
exec()方法在获取匹配信息方面颇有用,由于它会返回一个包含匹配信息的对象。exec() 返回的对象有一个index属性,能够告诉咱们成功匹配出如今字符串中的哪一个位置。这个功能在 很多地方都能派上用场:code

var match = /\d+/.exec("There are 100 ways to do this");
    console.log(match);
    // ["100"]
    console.log(match.index);
// 10
复制代码

()组合符的用法:
选择结构可使用|(管道符)来表示。例如,/a|b/能够匹配字符a或b,/(ab)+|(cd)+/ 能够匹配一个或多个ab或cd。

首部(^)与尾部($)

咱们常常须要确保模式在字符串的首部或尾部进行匹配。当脱字符(^)用做正则表达式的 第一个字符的时候,能够将匹配过程锁定在字符串的开头,所以,/^test/只可以匹配出如今待 匹配字符串起始位置上的test子串。与此相似,美圆符号()表示模式必须出如今字符串的尾部: /test/。
^和配合使用,代表指定的模式必须涵盖整个待匹配的字符串:/^test/。

向后引用

在字符串String使用replace()方法时,可使用特殊的字符序列$1,$2...来表示对应的分组。

var orig = "1234 5678";
var re = /(\d{4}) (\d{4})/;
var modifiedStr = orig.replace(re, "$2 $1"); 
console.log(modifiedStr); // 输出"5678 1234"
复制代码

贪婪限定符(全部限定符) 与 惰性限定符(?)

例如,模式\d+可以匹配一个或多个数字。若是字符串是123的话,贪婪匹配能够匹配到一、 12和123。贪婪模式h.+1能够匹配字符串hello中的hell——这是可以匹配的最长的字符串。 由于\d+是贪婪匹配,因此它会尽量多地匹配数字,故最后的匹配结果就是123。
与贪婪限定符相反,惰性限定符则是尽量少地匹配字符。能够在正则表达式后面加上问号 (?),使其成为惰性匹配。惰性模式h.?l能够匹配字符串hello中的hel—— 这是可以匹配到的最短的字符串。
模式\w*?X能够匹配到0个或多个单词以及一个X。可是*后的?表示应该尽量少地匹配字 符。对于字符串abcXXX,匹配结果能够是abcX、abcXX或abcXXX,那究竟应该匹配哪个呢? 由于*?是惰性模式,因此应该尽量少地匹配,所以最后的匹配结果是abcX。
删除字符串首尾多余的空白字符是一个极其常见的用法。直到最近,String对象自己都没有 trim()方法,一些JavaScript库为没有String.trim()方法的旧浏览器提供了字符串修剪功能。 最经常使用的方法以下所示:

function trim(str) {
   return (str || "").replace(/^\s+|\s+$/g,"");
}
console.log("--"+trim(" test ")+"--");
//"--test--"

//若是咱们想把重复的空白字符替换成单个呢?

 re=/\s+/g;
 console.log('There are a lot of spaces'.replace(re,' '));
 //"There are a lot of spaces"
复制代码

在上面的代码片断中,咱们尝试匹配一个或多个空格字符序列,而后将其替换成单个空格。 如你所见,正则表达式就像是JavaScript兵器库中的一把瑞士军刀。从长远来看,细心学习、 充分实践,将为你带来丰厚的长期回报。

相关文章
相关标签/搜索