专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 正则表达式单词:正则基础的 \b 单词边界 »正文

正则表达式单词:正则基础的 \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

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: