正则表达式(regular exoression)是一种描述字符串数据模式的方法。简单来说他可以规定字符串格式,常用作字符串提取、匹配及验证使用。
有两种方式创建正则表达式: 1.使用RegExp构造函数:
var reg = new RegExp("abc");tips:使用该方法时,需要将模式写成普通字符串,因此反斜杠的使用规则与往常相同。 2.使用斜杠(/)将模式包围起来,生成一个字面值
/pattern/modifiers; /模式/修饰符 var reg = /abc/i;字符串对象的search方法用于检索字符串,参数可传入字符串和正则表达式。当传入字符串时,会将字符串转换为正则表达式处理。
var str = "www darkclouds Top"; var result = str.search(/top/i); //15replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子字符串。
var str = "www darkclouds Top"; var result = str.search(/top/i,"com"); //15前面了解了正则表达式的语法,双/后面的modifiers即表示修饰符,共有三个修饰符: 1. i:不区分大小写 2. g:全局匹配(查找所有匹配而非在找到第一个匹配后停止) 3. m:执行多行匹配。
test方法用于检测一个字符串是否匹配某个模式,返回boolean类型数据。
/abc/.test("abcde");exec方法用于检索字符串中的正则表达式的匹配,返回一个数组,存放匹配的结果。如果未找到匹配则为null。
var match = /\d+/.exec("20 one two 100"); console.log(match); //["100"] console.log(match.index); //8 match: Array={ 0:"20" index:0 input:"20 one two 100" length:1 }疑问 为什么没有将所有所匹配结果都放在数组中?遇到第一个匹配就返回了?
因此我们可以用快捷写法写日期的验证,如2017-03-09 10:24:08可以写成:
var dateReg = /\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d/;这也太tm长了!呆会我们再换个方式处理。
我们可以将反斜杠代码用在方括号中,如[\d.]匹配任意数字或者一个句号。但是句号会使它失去特殊含义,因为.表示除了换行符意外任意符号,而原模式想匹配的是[任意数字.]。有些其他字符也会出现这种问题,比如+。 遇到这种问题,我们可以在方括号后添加脱字符(^)来排除某个字符集,即表示不匹配这组字符中的任何字符,也可以理解成非:
var notBinary = /[^01]/; //非(0或1) console.log(notBinary.test("110010010010100")); //false console.log(notBinary.test("11001010110001102")); //true 因为除0、1外 有2可以匹配。匹配一个整数(一个活多个数字的序列): 在正则表达式某个元素后面添加一个加号(+),表示该元素至少重复一次。因此/\d+/可以匹配一个或多个数字字符。
console.log(/'\d+'/.test("'123'")); //true console.log(/'\d+'/.test("''"); //false console.log(/'\d*'/.test("'123'"); //true console.log(/'\d*'/.test("''")); //true星号(*)有的含义与加号类似,但是可以匹配模式不存在的情况。在正则表达式的元素后添加星号并不会导致正则表达式停止匹配该元素后面的字符。只有正则表达式无法找到可以匹配的文本时菜考虑匹配该元素从未出现的情况。 元素后面跟一个问号表示这部分模式”可选”,即模式可能出现0次或1次。
//匹配neighbour(u出现1次),也可以匹配neighbor(u没有出现)。 var neighbor = /neighbou?r/; console.log(neighbor.test("neighbour")); //true console.log(neighbor.test("neighbor")); //true跨括号({ })准确指明某个模式的出现次数。 1. /\d{4}/:表示数字只能出现4次 2. /\d{2,4}/:表示数字至少出现2次,最多出现4次。 3. /\d{ ,4}/:花括号可以省略任意一侧的数字,表示至多、至少的意思。
如果想一次性对多个元素使用*或者+,那么你需要使用圆括号将这些元素包围起来,创建一个分组。这些操作符会将包围在括号中的那部分正则表达式当作一个整体处理。
var reg = /boo+(hoo+)+/i; console.log(reg.test("Boohoooohoohooo")); //true两个+字符分别作用于boo和hoo的o字符,而第三个+字符则作用于整个元组(hoo+),可以匹配hoo+这种正则表达式出现一次及一次以上的情况。
上述表达式末尾的i表示正则表达式不区分大小写,虽然模式中使用小写字母。
test方法是匹配正则表达式最简单的方法,该方法只负责判断字符串是否与某个模式匹配。 正则表达式还有一个exec方法,如果无法匹配模式则返回null,否则返回一个表示匹配字符串信息的对象。
var match = /\d+/.exec("one two 100"); console.log(match); //["100"] console.log(match.index); //8exec方法返回的对象包含Index属性,表示字符串成功匹配的起始位置。除此之外,该对象是一个字符串数组,其首元素是与模式匹配的字符串。
字符串也有一个类似的match方法:
console.log("one two 100".match(/\d+/)); //["100"]若正则表达式包含使用圆括号保卫的子表达式分组,与这些分组匹配的文本也会出现在数组中。第一个元素是与整个模式匹配的字符串,其后是与第一个分组匹配的部分字符串(表达式中第一次出现在左圆括号的那部分),然后是第二个分组。
var quotedText = /'([^']*)'/; console.log(quotedText.exec("she said 'hello'")); ["'hello'", "hello"]/(.).*\1/g
更多内容请移步W3C http://www.w3cschool.cn/jsref/jsref-obj-regexp.html