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 单词边界相关推荐

  1. Java提取文本文档中的所有网址(小案例介绍正则基础知识)

    正则表达式基础以及Java中使用正则查找 定义: 正则表达式是一些用来匹配和处理文本的字符串 正则的基础(先大致了解下) 1. 正则表达式的作用 查找特定的信息(搜索) 替换一些文本(替换) 2. 正 ...

  2. 正则基础之——神奇的转义

    1        概述 这或许会是一个让人迷惑,甚至感到混乱的话题,但也正因为如此,才有了讨论的必要. 在正则中,一些具有特殊意义的字符,或是字符序列,被称作元字符,如"?"表示被 ...

  3. 正则基础之——反向引用

    From: http://blog.csdn.net/lxcnn/article/details/4476746 1        概述 捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用, ...

  4. SHELL学习之一《正则基础》(转)

    目 录 什么是正则表达式 范例     简单 中级(神奇的咒语) 困难(不可思议的象形文字) 不同工具中的正则表达式 什么是正则表达式一个正则表达式,就是用某种模式去匹配一类字符串的一个公式.很多人因 ...

  5. 正则基础知识学起来很简单

    正则基础知识学起来很简单 第一.正则表达式,也称为模式表达式,它有自己一套完整编写规范. 正则表达式的用途:正则表达式主要是用来对字符串进行匹配.查找.替换和分割等操作. 第二.正则表达式主要是由四部 ...

  6. 【转】正则基础之——捕获组(capture group)

    源地址 1        概述 1.1     什么是捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用.当然,这种引用既可以是在正则表达式内部, ...

  7. vim中正则表达式匹配单词边界

    一般的高级语言中匹配单词边界用的是"\b",匹配非单词边界用"\B". 但是在vim中使用\b,发现不认识.上网搜索了一番,终于找到了: 匹配单词左边界:\&l ...

  8. 正则基础之——非捕获组

    非捕获组:(?:Expression) 接触正则表达式不久的人,通常都会对非捕获比较迷惑,为什么要有非捕获组?作用是什么?应该在什么场景下使用? 说到非捕获组,首先要了解什么是捕获组,详细内容参考 正 ...

  9. .NET正则基础之——平衡组

    1        概述 平衡组是微软在.NET中提出的一个概念,主要是结合几种正则语法规则,提供对配对出现的嵌套结构的匹配..NET是目前对正则支持最完备.功能最强大的语言平台之一,而平衡组正是其强大 ...

最新文章

  1. RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例
  2. 这是什么神仙公司?居然公布离职员工信息,还给差评?
  3. mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...
  4. 如何用 Python + Scrapy 爬取视频?
  5. pyppeteer(python版puppeteer)基本使用
  6. 空间数据引擎oracle_GIS 与Oracle 数据库空间数据格式的转换
  7. SAP C4C - Field creation not permitted in partner devel
  8. [BZOJ4320][ShangHai2006]Homework(根号分治+并查集)
  9. mysql group by自定义_mysql – GROUP BY和自定义顺序
  10. 安卓逆向_10 --- Log 日志的插入和分析、toast方法、栈跟踪
  11. 不属于html5表单元素的是,HTML5 表单元素
  12. 冒泡排序代码_凡人能看懂的冒泡排序和快速排序(附动态图和代码详解))
  13. 装了linux后windows被破坏了,windows下可以破坏linux的数据么-
  14. Java 8 异步 API、循环、日期,用好提高生产力!
  15. hdu 4128 Running relay (线性规划转半平面交)
  16. mysql手册03_索引
  17. pandas的重复值的处理
  18. 一周信创舆情观察(7.5~7.11)
  19. 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp,eip
  20. python xlwt 用法演示

热门文章

  1. jQuery plugin 开发的一个例子
  2. 如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
  3. ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable
  4. sap.ui.require in SAP UI5 and require in nodejs
  5. Jerry的Fiori原创文章合集
  6. 取0-1中间任意数java_java – 找到一个整数n 0,其中包含以下三个条件
  7. mysql schema设计_mongodb 的 schema 设计方法
  8. UE4学习-使用蓝图进行一个关卡的设计
  9. flex 图片上传并以二进制保存到oracle数据库,flex 加载并显示图片 图片转化成二进制...
  10. oracle查看语句执行历史,AWT查看oracle历史sql语句执行