什么是贪婪模式和非贪婪模式?
- 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。
- 属于贪婪模式的量词,也叫做匹配优先量词,包括:
“{m,n}”
、“{m,}”
、“?”
、“*”
和“+”
。
在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:
“{m,n}?”
、“{m,}?”
、“??”
、“*?”
和“+?”
。
从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。
一个例子
源字符串:aa<div>test1</div>bb<div>test2</div>cc
- 贪婪模式
正则表达式一:<div>.*</div>
匹配结果一:<div>test1</div>bb<div>test2</div>
- 非贪婪模式
正则表达式二:<div>.*?</div>
匹配结果二:<div>test1</div>
写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)。
function isValidUsername(str){
reg=/^\w{6,20}$/g
return reg.test(str)
}
写一个函数isPhoneNum(str),判断用户输入的是不是手机号。
function isPhoneName(str){
reg=/^1[3578]\d{9}$/g
return reg.test(str)
}
写一个函数isEmail(str),判断用户输入的是不是邮箱。
function isEmail(str){
reg= /^([a-zA-Z0-9_\-])+@([a-zA-Z0-9_\-])+(\.[a-zA-Z0-9_\-])+$/
return reg.test(str)
}
写一个函数trim(str),去除字符串两边的空白字符。
function trim(str){
return str.replace(/(^\s*)|(\s*)$/g,"")
}
\d
,\w
,\s
,[a-zA-Z0-9]
,\b
,.
,*
,+
,?
,x{3}
,^
,$
分别是什么?
-
\d
,等价于[0-9]
,匹配数字字符
-
\w
,等价于[a-zA-Z_0-9]
,匹配单词字符,字母数字下划线
-
\s
,等价于[\t\n\x0B\f\r]
,匹配空白字符
-
\b
,匹配单词边界
-
.
,等价于[^\r\n]
,除了回车符和换行符之外的所有字符
-
*
,匹配任意多个(包括0个)
-
+
,匹配一个或多个(最少出现一次)
-
?
,匹配0个或一个(最多出现一次)
-
x{3}
,匹配x出现3次
-
^
,匹配开头,如果放在中括号内部的开头,则代表匹配不属于中括号内部任意一个的一个字符
-
$
匹配结尾
网友评论