正则基础之 \b 单词边界

2016-02-19 10:02 18 1 收藏

下面图老师小编要向大家介绍下正则基础之 \b 单词边界,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - Web开发 】

1概述
“b”匹配单词边界,不匹配任何字符。
“b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“b”是零宽度的。
基本上所有的资料里都会说“b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“w”所定义的字符所组成的子串。
“b”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置,也就相当于
(?!w)(?=w)|(?=w)(?!w)
思考:以下写法为什么不等价于“b”
(?=W)(?=w)|(?=w)(?=W)
2w的范围
即然涉及到“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;iarr.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;iarr.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”显然不在替换的范围内,所以正则可以用“btob”来限定。
用得比较多的场景是在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, @"b3b").Count; //结果:2
4.2 进阶应用
稍复杂一些的应用通常都是与其它一些正则语法规则一起使用的,参考一个帖子
求一正则表达式
4.3 特殊情况
“b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即
[a-zb]
此处的“b”表示的是退格键,而不是单词边界。

来源:https://www.tulaoshi.com/n/20160219/1593080.html

延伸阅读
标签: autocad教程
6.2.1边界的概念与创建命令 所谓边界(Boundary)就是某个封闭区域的轮廓,使用边界命令可以根据封闭区域内的任一指定点来自动分析该区域的轮廓,并可通过多段线(Polyline)或面域(Region)的形式保存下来。如图6-2所示。 该命令的调用方式为: 菜单:【Draw(绘图)】→【Boundary…(边界)】 命令行:boundary(或别名bo) 调用该...
扇贝单词如何修改我的单词书?   扇贝单词如何修改我的单词书?很多刚接触扇贝单词的小伙伴,第一次选择了单词本学习完单词后找不到如何更换单词书。其实操作方法很简单,下面一起随小编看下扇贝单词更改单词书方法吧! 1)安装并打开扇贝单词,点击主界面右上角的,选择。 2)在中点击,根据自己的需求选择想要学习的单...
必应词典我的单词本如何删除单词?   必应词典中想把不需要的单词删除该怎么做?小编来告诉大家必应词典我的单词本如何删除单词。 1)先打开,点击左上角,选择; 2)然后选择,点击右上角的; 3)勾选要删除的单词,点击右下方的,在弹框中点击即可。
必应词典单词如何添加到单词本?   小伙伴用了必应词典之后都问该怎么把一个单词添加到自己的单词本当中呢?这就让小编来告诉大家必应词典单词如何添加到单词本。 首先打开,在默认页面最下方内输入单词,点击符号进行搜索,之后点击单词旁边的符号即可。
有道词典单词本同步曲线背单词   首先我们要弄清楚如何将单词加入单词本,其实这非常的简单。不论是有道词典中搜索的单次结果,还是通过划词释义和屏幕取词弹出的翻译界面上,都会有一个添加到单词本的图标,就如下图所示。点击图标后,单词就自动保存到单词本中了。 添加单词到单词本 打开单词本的位置处于有道词典主界...

经验教程

371

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部