javascript正则表达式 "\b"问题

preface

昨晚在看《javascript权威指南》后,看见作者自己封装一个兼容所有浏览器的山寨HTML5新API classLIst类。自己想了想觉得自己也要去玩一下,但是能力还是有限,所以就遇见一个正则表达式的bug,确实自己对正则表达式有兴趣但是掌握不是很好。困扰了一段时间,早上在stack overflow网站中找到了答案。

issue description

首先我创建一个类叫CSSClassList

  CSSClassList = function(el){
   this.el = typeof el=="object"?el:document.getElementById(el);
}

然后就在CSSClassList原型中添加方法,我模仿classList类中的contains(check if an element‘s list of classes contains a specific class),这个方法是用来检查该元素有没包含指定的类选择器。

  CSSClassList.prototype.contains = function(cls) {
   var classname = this.el.className, reg = new RegExp("\b" + cls + "\b");
   return reg.test(classname);
}

然后就出问题,你可以试一下,我就不想贴出我的HTML和CSS了,问题就在于你要查询的元素用contains测是否包含指定类选择器都是为false的,无论该元素是否包含。为什么呢?昨天晚上就在这里栽了。

debug

我把我的目标放在正则表达式上,我在想是不是我的正则表达式写错了

1 在contains方法中console.log出reg
结果:比如我传给contains函数的实参是为"font",那么console.log出来的是/font/
心里活动: 看到这个答案我就郁闷下,这样子应该是可以匹配的到的呀
2 在contains方法中return后面的reg改成/font/,就变成了/font/.test(classname)
结果:返回的是true
心里活动:什么情况,奇葩javascript你在干什么啊!!心中更加郁闷
3 在contains方法中的new RegExp("\b" + cls + "\b")改成new RegExp(cls)
结果:返回的是true
心里活动:啊!好像找到问题所在了,是字符串中的\b问题
4 用google搜索stackoverflow相关问题
结果:Javascript RegExp and boundaries
心里活动:总算让我知道原因所在了。

summary

"\b"
这个在javascript解析器中它会解释为退格键,我们知道退格键的ASCII码是8。我们可以这样子来测试下:
"\b".charCodeAt(0) == 8 结果是为true
"\\b"
\是用来阻止javascript解析器把"\b"解析成退格键,可以用同样的方法来测试下
"\\b".length "\\b".charCodeAt(0) "\\b".chatCodeAt(1)分别为2 92 98
new RegExp("\\b"+cls+"\\b")
用console.log打印出来是,假如我的cls为"font",打印结果为"\bfont\b",而之前那个new RegExp("\b"+cls+"\b")打印出来的是"(退格键)font(退格键)",但是在这个单词左右还有两个退格键,所以我匹配不了"font"。这个是本文的重点

last

   CSSClassList.prototype.contains = function(cls) {
    var classname = this.el.className, reg = new RegExp("\\b" + cls + "\\b");
    return reg.test(classname);
}

reference

Javascript RegExp and boundaries

时间: 2024-10-14 10:07:50

javascript正则表达式 "\b"问题的相关文章

javascript正则表达式修饰符之multiline(/m)的使用

javascript正则表达式有3种修饰符/i./m和/g./i是我们最常用,也是最好理解的,代表正则表达式匹配的时候不区分大小写. var regex = /abc/i; alert(regex.test("aBc"));//true /m代表多行模式multiline,如果目标字符串中不含有换行符\n,即只有一行,那么/m修饰符没有任何意义. var multiline = /abc/m; var singleline = /abc/; //目标字符串不含换行符\n var tar

javascript 正则表达式补充

定义 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%>','g'); 2. 字面量 var reg=/<%[^%>]%>/g; g: global,全文搜索,默认搜索到第一个结果接停止 i: ingore case,忽略大小写,默认大小写敏感 m: multiple lines,多行搜索 元字符 正则表达式让人望而却步以一个重要原因就是其转

javascript正则表达式定义的方法是什么

javascript正则表达式的2种定义方法:一种是直接调用RegExp(),第二种是直接用字面量来定义,即var re = /正则规则/; js正则表达式的2种定义方法本质都是调用RegExp()方法 在调用同一段正则代码的时候,ECMAScript3和ECMAScript5中表现完全不一样 function reg(){ var re = /\sjavascript/; return re; } 分别在ECMAScript3和ECMAScript5中调用reg()方法多次 在ECMAScri

web前端之JavaScript正则表达式

web前端之JavaScript正则表达式 后面有代码: \d 表示数字 \d? ?表示0个或者一个 \d+ +表示一个或者多个 \d{3} 表示三个 \d{3,5} 表示三到五个 \d{3,} 表示至少出现3次 \d* *表示0到任意个 \b 表示单词边界 \B 表示非单词边界 \bis\b 表示查找" is "的 . 表示任意字符 \ 表示转译 http:(\/\/.+\.jpg) 用()进行分组 $1 获取其内部东西 []表示或 ^表示开头 $表示结尾 g表示全局 \d{4}[/

JavaScript - 正则表达式举例

JavaScript - 正则表达式举例 正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符则匹配失败. 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符:非贪婪的则相反,总是尝试匹配尽可能少的字符.例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb".而如果使用非贪婪

javascript正则表达式简介

javascript正则表达式 javascript正则表达式 regular expression是一个描述字符模式的对象: ECMAScript中的RegExp类表示正则表达式: String和RegExp都定义了使用正则表达式进行强大的模式匹配.文本检索和替换的函数: 正则表达式主要用来验证客户端的输入数据: Ⅰ.创建正则表达式 类似于创建字符串,可以使用new运算符也可以采用字面值: 参数 含义 g 全局匹配 i 忽略大小写 m 多行匹配 下文中的javascript代码是通过 Ecli

自己实现的一款在线Javascript正则表达式测试器——JRE-Parser

本文最初发布于我的个人博客:http://jerryzou.com/posts/jreparser/ 昨天在看<正则表达式30分钟入门教程>的时候,看到博主自己实现了一个C#写的正则测试器,看上去挺方便的样子.但是我自己又不太喜欢乱装东西,所以寻思着能不能自己实现一个javascript正则表达式测试器.于是几十行代码实现了这样一个正则测试器. 先展示一下0.1版本的效果图吧~ 页面还比较简单,但是基本功能算是有了.可以正常使用~. 关于怎么从用户的输入中提取正则表达式的过程多亏@依云大神提点

JavaScript之基础-10 JavaScript 正则表达式(概述、定义正则、RegExp对象、用于模式匹配的String方法)

一.JavaScript 正则表达式概述 正则表达式概述 - 正则表达式(Regular Expression): 由一些普通字符和特殊字符组成的,用以描述一种特定的字符规则的表达式 - 正则表达式常用于在一段文本中搜索.匹配或替换特定形式的文本.如:词语出现频率统计.验证字符串是否符合邮件格式.屏蔽一篇帖子中的限制性词语等 正则表达式初体验 - 验证用户输入的手机格式是否合法 二.JavaScript 定义正则表达式 普通字符 - 所有的单个大小写字母.数字都是一个正则表达式,用以匹配单个字符

JavaScript正则表达式-字符

JavaScript正则表达式字符包括两类: 1.普通字符. 2.转义字符. 普通字符 大小写字母.数字.其他任何符号. 转义字符 转义字符 含义 \f 换页符 \n 换行符 \r 回车符 \t 制表符 \b 退格符 \o 空字符 \xnn 由十六进制数nn指定的ASCII码对应的字符 \uxxx 由十六进制数xxxx指定的Unicode字符 \\ 反斜线 ^ 要匹配"^"字符本身需要使用"\^" $ 要匹配"$"字符本身需要使用"\$

JavaScript正则表达式语法及使用范例大全

JavaScript正则表达式 1.      使用JS正则表达式,首先要了解JS正则表达式的常用符号,如下图: /-/ 代表一个模式的开始和结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 \s 匹配一个空白字符 \S 匹配一个非空白字符 \d 匹配一个数字字符,等价于[0-9] \D 匹配一个非数字字符,等价于[^0-9] \w 匹配一个数字.字母.或下划线,等价于[A-Za-z0-9_] . 匹配一个除了换行符之外的字符 \ 转义字符,对于上述这些特殊的符号,如果要匹配,则需要加\进行转义