如何正确理解正则表达式中的分隔符 \b
前言:好久不见,博客园。
最近在学习研究regex,其中有个特迷惑自己的知识点是分隔符 ( word boundary) [\b] (注:为了方便,后文都以[]来包含字符,并不是reg规则里面的[] ),后面查询咨询了解,明白了,记录下来,希望帮到恰好迷惑的你。
[\b] 官方解释是:Match a word boundary,匹配一个单词边界,也就是单词和空格之间的位置,它本身不匹配任何字符。一般它有三种情况,如下:
- 在一个 \w 字符之前,eg: \bend
- 在一个 \w 字符之后,eg: end\b
- 在两个字符之间 ;
情况1,2都比较容易理解,这里就略过,主要从第3种情况来讲讲理解。
最开始从网上看到这样一句话:“如果需要更精确的说法,[\b] 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) [\w] (匹配字母或数字或下划线或汉字)”;
那做个试验:
var reg = /end\band/g;
var string = 'wenkend,end,and,endend';
alert( reg.test(string) ) ; //false
根据上述理解 [\b] 要求它分隔的是一边是 [\w] , 一边是非 [\w]。我最开始理所当然的理解为正则表达式 [ end\band ] 匹配字符串 [end,and] end的右边是分隔符 [,] ,符合匹配,and的左边是分隔符 [,] , 符合匹配。那么它就应该符合匹配,可是为什么结果是 false 呢?
后面发现自己大错特错。
正确理解如下分三步来理解:
-----------------
/end\band/g, "end,and" (匹配end,true)
| |
----------------- /end\band/g, "end,and" (匹配end后面是否有分隔符,有[,] - true)
| |
------------------ /end\band/g, "end,and" (now,接下来匹配的是否是字符and,因为 [\b]只是匹配匹配一个位置,本身并不匹配任何字符,所以
等待匹配的字符串应该是 [,and] ,而不是[and],显而易见,[,and] 并不符合匹配规则 [and] - false)
总结来说就是:[end\band] 或者其他类似这样的正则表达式是没有意义的,可以说永远也不会存在的。
如果 [\b] 在中间,regex表达式写法必须遵循在 [\b] 的左右两侧一个是[\w],一个是非 [\w],例如 [end\,] .
如有错误或疑问或建议,请指正,谢谢~
如何正确理解正则表达式中的分隔符 \b的更多相关文章
- 2.如何正确理解古典概率中的条件概率《zobol的考研概率论教程》
写本文主要是帮助粉丝理解考研中的古典概率-条件概率的具体定义. "B事件发生的条件下,A事件发生的概率"? "在A集合内有多少B的样本点"? "在B约 ...
- 正确理解JavaScript中的this关键字
JavaScript有this关键字,this跟JavaScript的执行上下文密切相关,很多前端开发工程师至今对this关键字还是模棱两可,本文将结合代码讲解下JavaScript的this关键字. ...
- (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思
我从知乎看到的两个答案,分别从实际意义以及语言学角度告诉你改怎么理解PR,很简洁,这个理解非常棒,会解决新手刚看到PR(pull request)这个词时的困惑. 实际意义: 有一个仓库,叫R ...
- 正确理解MySQL中的where和having的区别
原文:https://blog.csdn.net/yexudengzhidao/article/details/54924471 以前在学校里学习过SQLserver数据库,发现学习的都是皮毛,今天以 ...
- 如何正确理解古典概率中的条件概率 《考研概率论学习之我见》 -by zobol
"B事件发生的条件下,A事件发生的概率"? "在A集合内有多少B的样本点"? "在B约束条件下,A发生的概率变化为?" "B事件中 ...
- 正确理解WPF中的TemplatedParent
(注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于名称不是很统一,文中统一用英文名称代表两个概念,况且VisualTreeHelper和Logical ...
- 正确理解WPF中的TemplatedParent (转贴)
http://blog.csdn.net/idebian/article/details/8761388 (注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树 ...
- 正确理解python中的赋值语句:a, b = b, a + b
赋值语句: a, b = b, a + b 相当于: t = (b, a + b) # t是一个tuple a = t[0] b = t[1] 但不必显式写出临时变量t就可以赋值.
- javascript中正则表达式中的 match,exec,test,replace 之我理解
这个正则 ($&) 的语法: https://msdn.microsoft.com/library/3k9c4a32(v=vs.94).aspx 在ECMAScript中对这几个的说明: ma ...
随机推荐
- SQL Server中调用WebService的实例
尊重原著作:本文转载自http://www.cnblogs.com/icycore/p/3532197.html 1.Ole Automation Procedures 服务器配置选项 当启用 OLE ...
- OleDbHelper
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...
- UVa 1583 - Digit Generator
A+A的每一位的数字的和=B 问你每一个B对应 的最小的A 是多少 不然输出0: #include <cstdio> #include <iostream> #include ...
- DWZ 框架remote 验证字段唯一性方法提交后台,如果是中文会显示成乱码问题
关于jquery remote 验证字段唯一性方法提交后台,如果是中文会显示成乱码问题.可以直接修改tomcat 配置文件server.xml 设置 URIEncoding=utf-8属性,将ge ...
- EditText默认不弹出软键盘
#EditText默认不弹出软键盘# 网上关于EditText默认情况下不弹出软键盘,当手触摸到EditText,获取焦点时候,才会弹出软键盘,貌似都不能用,其实,在oncreate()方法中,加上 ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- 异步操作AsycnTask类
1. 首先执行onPreExecute方法,进行UI的初步设置 2. 其次执行doInBackground方法,此时将不在UI中线程中进行了 3. 然后如果要进行中的数据的话可以通过publis ...
- C++临时对象销毁时间
下面这段代码会输出什么? const char* p = string("hello temprary string").c_str(); cout << p; 下面这 ...
- OC 语法基础一
1.判断字符串开头 或 结尾 测试字符串是否以aString开始 - (BOOL)hasPrefix:(NSString *)aString; 测试字符串是否以aString结尾 - (BOOL)ha ...
- Java入门基础总结(二)
判断语句 if else 如下: 1 /* 2 语法: 3 if(条件) 4 { 5 ...