正则表达式单词:正则基础的 \b 单词边界来源: 发布时间:星期一, 2009年9月7日 浏览:8次 评论:0
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); (arr != null) { for(var i=0;i<arr.length;i) { document.write(arr[i] + "<br />"); } } </script> //JavaScript中输出 abc_123 _d3 efg C# 复制代码 代码如下: 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) { .out.prln(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); (arr != null) { for(var i=0;i<arr.length;i) { document.write(arr[i] + "<br />"); } } </script> //JavaScript中输出 3中 文_ 3= g汉 C# 复制代码 代码如下: 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) { .out.prln(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”个数 test = "137,1,33,4,3,6,21,3,35,93,2,98"; count = Regex.Matches(test, @"\b3\b").Count; //结果:2 4.2 进阶应用 稍复杂些应用通常都是和其它些正则语法规则起使用参考个帖子 求正则表达式 4.3 特殊情况 “\b”用在正则中通常情况下都是表示单词边界只有在组中它表示是退格键即 [a-z\b] 此处“\b”表示是退格键而不是单词边界 0
相关文章读者评论发表评论 |