正则基础之——\b 单词边界
1 概述
“\b”匹配单词边界,不匹配任何字符。
“\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。
基本上所有的资料里都会说“\b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“\w”所定义的字符所组成的子串。
“\b”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置,也就相当于
(?<!\w)(?=\w)|(?<=\w)(?!\w)
思考:以下写法为什么不等价于“\b”
(?<=\W)(?=\w)|(?<=\w)(?=\W)
2 \w的范围
即然涉及到“\w”,那就要先考察一下它的范围。
在支持ASCII码的语言中,如JavaScript,“\w”等价于[a-zA-Z0-9_] ;
在支持Unicode的语言中,如.NET,默认情况下,“\w”除可以匹配[a-zA-Z0-9_]外,还可以匹配一些Unicode字符集,如汉字,全角数字等等。
几乎所有常见的语言都遵循这样一个规律,只有Java是个例外。在Java中,“\w”的表现是比较奇怪的,Java是支持Unicode的,但Java的正则中的“\w”却是等价于[a-zA-Z0-9_]的。
先来看一下“\w”在几种语言中匹配的例子
JavaScript
<script language="javascript">
var str = "abc_123中文_d3=efg汉字%";
var reg = /\w+/g;
var arr = str.match(reg);
if(arr != null)
{
for(var i=0;i<arr.length;i++)
{
document.write(arr[i] + "<br />");
}
}
</script>
/*-------- JavaScript中输出--------
abc_123
_d3
Efg
*/
C#
string test = "abc_123中文_d3=efg汉字%";
MatchCollection mc = Regex.Matches(test, @"\w+");
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
}
/*-------- C#中输出--------
abc_123中文_d3
efg汉字
*/
Java
String test = "abc_123中文_d3=efg汉字%";
String reg = "\\w+";
Matcher m = Pattern.compile(reg).matcher(test);
while(m.find())
{
System.out.println(m.group());
}
/*-------- Java中输出--------
abc_123
_d3
Efg
*/
可以看到,“\w”在Java中的输出和JavaScript中是一样的,都是只支持ASCII字符。
3 \b的范围
常见语言中“\w”的范围确定了,那么是不是可以认为“\b”的匹配范围与“\w”也是一致的呢?
再看下下面的例子:
源字符串:abc_123中文_d3=汉字efg
正则表达式:.\b.
JavaScript
<script language="javascript">
var str = "abc_123中文_d3=efg汉字%";
var reg = /.\b./g;
var arr = str.match(reg);
if(arr != null)
{
for(var i=0;i<arr.length;i++)
{
document.write(arr[i] + "<br />");
}
}
</script>
/*-------- JavaScript中输出--------
3中
文_
3=
g汉
*/
C#
string test = "abc_123中文_d3=efg汉字%";
MatchCollection mc = Regex.Matches(test, @".\b.");
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
}
/*-------- C#中输出--------
3=
字%
*/
Java
String test = "abc_123中文_d3=efg汉字%";
String reg = ".\\b.";
Matcher m = Pattern.compile(reg).matcher(test);
while(m.find())
{
System.out.println(m.group());
}
/*-------- Java中输出--------
3=
字%
*/
可以看到,Java的输出和.NET是一致的,“\b”在Java中是支持Unicode的。
所以总的来说,Java中的“\w”是很奇怪的,而“\b”是与其它语言表现一致的,在使用时需要注意。
4 \b应用场景
4.1 基础应用
“\b”一般应用在需要匹配某一单词字符组成的子串,但这一字符不能包含在同样由单词字符组成的更长的子串中。
比如要替换掉一段英文中的单词“to”,而“today”显然不在替换的范围内,所以正则可以用“\bto\b”来限定。
用得比较多的场景是在HTML标签的匹配中,用以区分相互包含的标签,比如要过滤掉<b>、</b>、<p…>、<img…>等标签,但要保留<br />标签,正则可以写成“<(/?b|p|img)\b[^>]*>”。
举例:统计以“,”分割的元素中“3”的个数
string test = "137,1,33,4,3,6,21,3,35,93,2,98";
int count = Regex.Matches(test, @"\b3\b").Count; //结果:2
4.2 进阶应用
稍复杂一些的应用通常都是与其它一些正则语法规则一起使用的,参考一个帖子 求一正则表达式
4.3 特殊情况
“\b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即
[a-z\b]
此处的“\b”表示的是退格键,而不是单词边界。
转载于:https://www.cnblogs.com/Eleanore/archive/2012/06/13/2548227.html
正则基础之——\b 单词边界相关推荐
- Java提取文本文档中的所有网址(小案例介绍正则基础知识)
正则表达式基础以及Java中使用正则查找 定义: 正则表达式是一些用来匹配和处理文本的字符串 正则的基础(先大致了解下) 1. 正则表达式的作用 查找特定的信息(搜索) 替换一些文本(替换) 2. 正 ...
- 正则基础之——神奇的转义
1 概述 这或许会是一个让人迷惑,甚至感到混乱的话题,但也正因为如此,才有了讨论的必要. 在正则中,一些具有特殊意义的字符,或是字符序列,被称作元字符,如"?"表示被 ...
- 正则基础之——反向引用
From: http://blog.csdn.net/lxcnn/article/details/4476746 1 概述 捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用, ...
- SHELL学习之一《正则基础》(转)
目 录 什么是正则表达式 范例 简单 中级(神奇的咒语) 困难(不可思议的象形文字) 不同工具中的正则表达式 什么是正则表达式一个正则表达式,就是用某种模式去匹配一类字符串的一个公式.很多人因 ...
- 正则基础知识学起来很简单
正则基础知识学起来很简单 第一.正则表达式,也称为模式表达式,它有自己一套完整编写规范. 正则表达式的用途:正则表达式主要是用来对字符串进行匹配.查找.替换和分割等操作. 第二.正则表达式主要是由四部 ...
- 【转】正则基础之——捕获组(capture group)
源地址 1 概述 1.1 什么是捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用.当然,这种引用既可以是在正则表达式内部, ...
- vim中正则表达式匹配单词边界
一般的高级语言中匹配单词边界用的是"\b",匹配非单词边界用"\B". 但是在vim中使用\b,发现不认识.上网搜索了一番,终于找到了: 匹配单词左边界:\&l ...
- 正则基础之——非捕获组
非捕获组:(?:Expression) 接触正则表达式不久的人,通常都会对非捕获比较迷惑,为什么要有非捕获组?作用是什么?应该在什么场景下使用? 说到非捕获组,首先要了解什么是捕获组,详细内容参考 正 ...
- .NET正则基础之——平衡组
1 概述 平衡组是微软在.NET中提出的一个概念,主要是结合几种正则语法规则,提供对配对出现的嵌套结构的匹配..NET是目前对正则支持最完备.功能最强大的语言平台之一,而平衡组正是其强大 ...
最新文章
- RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例
- 这是什么神仙公司?居然公布离职员工信息,还给差评?
- mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...
- 如何用 Python + Scrapy 爬取视频?
- pyppeteer(python版puppeteer)基本使用
- 空间数据引擎oracle_GIS 与Oracle 数据库空间数据格式的转换
- SAP C4C - Field creation not permitted in partner devel
- [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)
- mysql group by自定义_mysql – GROUP BY和自定义顺序
- 安卓逆向_10 --- Log 日志的插入和分析、toast方法、栈跟踪
- 不属于html5表单元素的是,HTML5 表单元素
- 冒泡排序代码_凡人能看懂的冒泡排序和快速排序(附动态图和代码详解))
- 装了linux后windows被破坏了,windows下可以破坏linux的数据么-
- Java 8 异步 API、循环、日期,用好提高生产力!
- hdu 4128 Running relay (线性规划转半平面交)
- mysql手册03_索引
- pandas的重复值的处理
- 一周信创舆情观察(7.5~7.11)
- 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp,eip
- python xlwt 用法演示
热门文章
- jQuery plugin 开发的一个例子
- 如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
- ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable
- sap.ui.require in SAP UI5 and require in nodejs
- Jerry的Fiori原创文章合集
- 取0-1中间任意数java_java – 找到一个整数n 0,其中包含以下三个条件
- mysql schema设计_mongodb 的 schema 设计方法
- UE4学习-使用蓝图进行一个关卡的设计
- flex 图片上传并以二进制保存到oracle数据库,flex 加载并显示图片 图片转化成二进制...
- oracle查看语句执行历史,AWT查看oracle历史sql语句执行