正则基础之--/b单词边界

来源:互联网 发布:hpe软件学院 编辑:程序博客网 时间:2024/05/16 17:06

1 概述“/b”匹配单词边界,不匹配任何字符。“/b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“/b”是零宽度的。基本上所有的资料里都会说“/b”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“/w”所定义的字符所组成的子串。“/b”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置,也就相当于(?

/*-------- JavaScript中输出--------abc_123_d3Efg*/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中文_d3efg汉字*/JavaString 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_d3Efg*/可以看到,“/w”在Java中的输出和JavaScript中是一样的,都是只支持ASCII字符。3 /b的范围常见语言中“/w”的范围确定了,那么是不是可以认为“/b”的匹配范围与“/w”也是一致的呢?再看下下面的例子:源字符串:abc_123中文_d3=汉字efg正则表达式:./b.JavaScript/*-------- 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=字%*/JavaString 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|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; //结果:24.2 进阶应用稍复杂一些的应用通常都是与其它一些正则语法规则一起使用的,参考一个帖子 求一正则表达式4.3 特殊情况“/b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即[a-z/b]此处的“/b”表示的是退格键,而不是单词边界。