正则表达式基本语法有两种
1.直接量语法
/patten/attributes
2.创建RegExp对象的方法
new RegExp(pattern, attributes)
patten: 字符串, attributes:可选, 包含i, g, m
支持正则的String方法
1. search(), 检索指定字符串, 返回位置, 忽略全局匹配
2. match(), 检索指定的值
普通情况,返回匹配成功的数组, 数组内三个元素, [匹配的文本, index:起始位置, input:调用次方法的字符串]
全局匹配时, 返回数组, 数组中存放匹配到的值
例:
var str = "hello world"; console.log(str.match("hello")); // ["hello", index: 0, input: "hello world"]
// 全局匹配 var str2="1 plus 2 equal 3" console.log(str2.match(/\d+/g)); //["1", "2", "3"]
3.replace()
4.split() 把一个字符串分割成字符串数组
基本语法: stringObject.split(separator, howmany)
参数: separator 必填, 在指定的地方分割
howmany 选填, 数组的最大长度
例:
var str = "what are you doing?"
console.log(str.split(" ")) // => ["what", "are", "you", "doing?"]
// 以 "" 分割字符串 console.log(str.split("")); /* * 打印:["w", "h", "a", "t", " ", "a", "r", "e", " ", "y", "o", "u", " ", "d", "o", "i", "n", * "g", "?"] */ // 指定返回数组的最大长度为3 console.log(str.split("",3)); // 打印 ["w", "h", "a"]
RegExp 对象方法
1.test(), 用于检测一个字符串是否匹配某个模式
基本语法: RegExpObject.test(str) 返回true或者false
2.exec(), 检索字符串中的正则表达式的匹配
基本语法: RegExpObject.exec(string)
返回一个数组,存放匹配的结果, 未找到匹配则返回null, 匹配成功时, 返回的数组中第一个元素为匹配到的字符串, 后面的参数为匹配到的分组, 然后是 index(起始位置) 和 input(匹配的字符串)
var str = "longen and yunxi"; console.log(/longen/.exec(str)); // 打印 ["longen", index: 0, input: "longen and yunxi"] // 假如没有找到的话,则返回null console.log(/wo/.exec(str)); // null
[]的含义
[abc] 查找在方括号中任意一个字符
[^abc] 查找不在方括号中的任意一个字符
[0~9] 查找0~9中的任意一个数字
(a|b|c) 查找小括号中任意一项
例:
var str = "abcde"
console.log(str.match( /[bcd][bcd]/ )) //=> ["bc", index:1, input:"abcde"]
元字符
. 查找任意的单个字符, 除换行符
\w 任意一个字母或数字或下划线
\W 非单词的字符, 与\w相反
\d 数字字符 0~9
\D 非数字字符
\s 匹配任何空白字符, 等价于[\f\n\r\t\v]
\S 匹配任何非空白字符
\b 匹配一个单词边界, 比如 ' er\b ' 可以匹配 ' nerver ' 中的 'er' , 但是不能匹配 'verb' 中的 'er'
\B 匹配非单词边界
\0 查找NUL字符
\n 匹配一个换行符
\f 换页符
\r 回车符
\t 制表符
\v 垂直制表符
\xxx 查找一个以八进制数xxx规定的字符
\xdd 查找以16进制数dd规定的字符
\uxxxx 查找以16进制数xxxx规定的Unicode字符
转义字符
^ $ * + . [ ? / { | 需要转义
量词
n+ >0
n* >=0
n? 0 | 1
n{x} x个n
n{x, y} 至少x个, 至多y个
n{x, } 至少x个
n$ 以n结尾
^n 以n开头
?=n 匹配其后紧接指定的n的字符串
?!= 匹配其后没有紧接指定的n的字符串
例:
var str = "my name is longen"
console.log(str.match( /na(?=m)/g )) //=> ["na"]
贪婪模式与非贪婪模式
常见的修饰贪婪模式的量词:
{x, y} {x, } ? * +
非贪婪模式,加个?
{x, y}? {x, }? ?? *? +?
匹配原理
1.量词优先级
ab?c 会优先考虑b?,匹配abc, 如果匹配失败, 则回溯 ,匹配ac
ab??c 会优先忽略b??, 匹配ac, 如果匹配失败, 则回溯, 匹配abc
2.环视
?= 和 ?! 只匹配, 不占位
3.分组 ()
非捕获性分组, 不存储 (?:)
4.反向引用
获取分组匹配后保存的值
var str = "longenaabcd"; console.log(str.match(/([ab])\1/)[0]);//aa
\1的意思是分组匹配和反向引用匹配到的值必须是一样的
参考:http://www.cnblogs.com/tugenhua0707/p/5037811.html