正则基础之 \b 单词边界(http://www.站长网.net/article/1933
发布时间:2020-12-14 04:36:01 所属栏目:百科 来源:网络整理
导读:1概述 “b”匹配单词边界,不匹配任何字符。 “b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“b”是零宽度的。 基本上所有的资料里都会说“b”是单词边界,但是关于“单词”的范围却是少有提
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;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. 复制代码代码如下: <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汉 复制代码代码如下: foreach (Match m in mc)
{ richTextBox2.Text += m.Value + "n"; } //C#中输出 3= 字% 复制代码代码如下: 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,35,93,2,98"; int count = Regex.Matches(test,@"b3b").Count; //结果:2 4.2 进阶应用 稍复杂一些的应用通常都是与其它一些正则语法规则一起使用的,参考一个帖子 求一正则表达式 4.3 特殊情况 “b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即 [a-zb] 此处的“b”表示的是退格键,而不是单词边界。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |