关于javascript的正则表达式中的一个问题
window.onload=function(){vardiv=document.getElementById('apDiv2000')div.className='AB...
window.onload = function(){
var div = document.getElementById('apDiv2000')
div.className = 'A B' //叠加了2个css样式一个叫A,一个叫B
hasClass(div,'A') //搜索现在的CSS样式名里面有没有A这个样式名
}
//搜索的方法,在传入元素的className中去匹配想要搜索的字符A,并打印出如果有返回true,没有就返回false
function hasClass(element,cName){
alert(!!element.className.match(new RegExp('(\\s|^)' + cName + '(\\s|$)','g')))
}
//问题来了,我的hasClass()方法的正则表达式中,如果写成
new RegExp('(\\s|^)' + cName + '(\\s|$)','g'))那么是没有问题的,返回也都是正常的
但是如果写成new RegExp('(\s|^)' + cName + '(\s|$)','g'))就会不能正确匹配
也是就空格 \s的问题,为什么必须在\s前面在加入一个\来转义\s呢?
因为测试 如果直接敲入空格,也是没有问题的,但是因为看着不明了所以不想直接敲入空格
想用\s代替空格,但是又一定要写成 \\s,求问这是为什么? 展开
var div = document.getElementById('apDiv2000')
div.className = 'A B' //叠加了2个css样式一个叫A,一个叫B
hasClass(div,'A') //搜索现在的CSS样式名里面有没有A这个样式名
}
//搜索的方法,在传入元素的className中去匹配想要搜索的字符A,并打印出如果有返回true,没有就返回false
function hasClass(element,cName){
alert(!!element.className.match(new RegExp('(\\s|^)' + cName + '(\\s|$)','g')))
}
//问题来了,我的hasClass()方法的正则表达式中,如果写成
new RegExp('(\\s|^)' + cName + '(\\s|$)','g'))那么是没有问题的,返回也都是正常的
但是如果写成new RegExp('(\s|^)' + cName + '(\s|$)','g'))就会不能正确匹配
也是就空格 \s的问题,为什么必须在\s前面在加入一个\来转义\s呢?
因为测试 如果直接敲入空格,也是没有问题的,但是因为看着不明了所以不想直接敲入空格
想用\s代替空格,但是又一定要写成 \\s,求问这是为什么? 展开
2个回答
展开全部
*、?、+、{n}、{n,m}这几个表示匹配次数的符号默认都是贪婪匹配,意思就是以这几个符号前面的一个字符或子表达式能匹配的字符串连续出现次数在这几个符号所能表示的次数范围内最多的字符串作为匹配结果。这些符号后面加?号表示懒惰匹配,表示以次数出现最少的匹配。
?表示匹配0或1次,只要前面的字符或表达式能匹配的字符串出现一次,出现的就会被匹配。正好这里的ba后面有个d,符合出现1次的要求,所以会把d匹配。如果写成bad??,匹配的就是ba了。
*表示匹配0或多次,同样默认是贪婪匹配,会以它前面的子表达式([bd]ad?)在目标字符串中能匹配到的结果连续次数最多的条件进行匹配。([bd]ad?)能在"baddad"中连续匹配2次,所以就把这连续匹配到的结果作为一次整体匹配结果。如果在*后面加?,写成([bd]ad?)*?,则表示以([bd]ad?)出现0次进行匹配,匹配到的结果当然就是空了。
另外出现这样的两个结果是因为match方法的参数即正则没有加g(全局匹配模式),所以正则整体只匹配一次,匹配到的结果作为结果数组的第一个元素,正则中第一个子表达式在结果中匹配的结果作为结果数组的第二元素,正则中第二个子表达式在结果中匹配的结果作为结果数组的第三元素,以此类推。这里只有1个子表达式,所以([bd]ad?)在正则整体匹配到的结果中匹配的结果dad放到了结果数组的第二个元素。
?表示匹配0或1次,只要前面的字符或表达式能匹配的字符串出现一次,出现的就会被匹配。正好这里的ba后面有个d,符合出现1次的要求,所以会把d匹配。如果写成bad??,匹配的就是ba了。
*表示匹配0或多次,同样默认是贪婪匹配,会以它前面的子表达式([bd]ad?)在目标字符串中能匹配到的结果连续次数最多的条件进行匹配。([bd]ad?)能在"baddad"中连续匹配2次,所以就把这连续匹配到的结果作为一次整体匹配结果。如果在*后面加?,写成([bd]ad?)*?,则表示以([bd]ad?)出现0次进行匹配,匹配到的结果当然就是空了。
另外出现这样的两个结果是因为match方法的参数即正则没有加g(全局匹配模式),所以正则整体只匹配一次,匹配到的结果作为结果数组的第一个元素,正则中第一个子表达式在结果中匹配的结果作为结果数组的第二元素,正则中第二个子表达式在结果中匹配的结果作为结果数组的第三元素,以此类推。这里只有1个子表达式,所以([bd]ad?)在正则整体匹配到的结果中匹配的结果dad放到了结果数组的第二个元素。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询