一基础知识
方括号范围
在ascii码表中是连续的才可以用“-”写在方括号里面
[ ]在某个范围
[^]不在这个范围
(|)或者
小知识:
Ascii码表
A65
a97
量词
+最少一个
*0个或者多个
?0个或者1个
{x}匹配x次
{x,y}匹配最少x最多y
{x,}匹配至少x次
^n 这里的n代表字符串,只能以n开头的字符串
n$ 这里的n代表字符串,只能以n结尾的字符串
?=n这里的n代表字符串,任何其后紧接指定字符串 n 的字符串
?!n
这两个不好理解贴代码:
var str = "this is all is dog is all";
var reg = /is(?= all)/g;
var result;
while((result=reg.exec(str))!=null)
{
console.log(result);
}
结果为:
贪婪模式
str.match(/.*/g);
["wo shi ha12 en 3", ""]
开放模式
元字符
.单个字符
\w 单词字符,数字,下划线
\W
\d数字
\D
\s空白字符
\S
\b单词边界
\B
二两种定义方式
1.正则表达式的方法 / /i g(忽略大小写,全局匹配)
2.var reg=new RegExp(pattern,attributes);
三RegExp的方法(只有三个)
reg.test(string)
reg.exec()
reg.compile()
如代码测试:
var str="this is a first reg test.";
var reg=new RegExp("is","g");
console.log(reg.test(str));
var result;
var i=0;
while((result = reg.exec(str))!=null){
console.log(result);
i++;
if(i>10)break;
}
输出结果为:
想了解更多这三个方法:请参考 RegExp对象的三个方法.
顺便贴一张牛课网的试题:
三支持正则表达式的string的方法
search()
Index()
match() 用的比较多,找到内容若干个
replace() 查找并替换
split() 把字符串分割成数组
?:模式的理解:
(?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
\1的理解?\n的理解。
MDN上解释的\n和国内大部分对\n的解释不太相同。
国内:
查找换行符。
MDN:
Where n is a positive integer, a back reference to the last substring matching the n parenthetical in the regular expression (counting left parentheses).
For example, /apple(,)\sorange\1/ matches 'apple, orange,' in "apple, orange, cherry, peach."
翻译:
匹配和正则表达式中的括号(计算左括号)中出现相同内容的内容,数字代表匹配第几个括号。
有点像字符串中的replace。
示例:
var reg2 = /apple(,)\sorange(ww)\1\2/;
var str3 = 'apple, orangeww,ww'
//apple, orangeww,ww"
//,
//ww