`
luliangok
  • 浏览: 783993 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

一、 概述


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


二、/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);
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字符。


三、/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;i<arr.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”是与其它语言表现一致的,在使用时需要注意。


四、/b应用场景


4.1 基础应用
“/b”一般应用在需要匹配某一单词字符组成的子串,但这一字符不能包含在同样由单词字符组成的更长的子串中。
比如要替换掉一段英文中的单词“to”,而“today”显然不在替换的范围内,所以正则可以用“/bto/b”来限定。
用得比较多的场景是在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, @"/b3/b").Count; //结果:2


4.2特殊情况
“/b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即 [a-z/b] 此处的“/b”表示的是退格键,而不是单词边界。

原文出自脚本之家

分享到:
评论

相关推荐

    正则基础之 \b 单词边界

    1概述 “\b”匹配单词边界,不匹配任何字符。 “\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。 基本上所有的资料里都会说“\b”是单词...

    深入浅析正则表达式中的\B和\b

    先说说\b这个单词边界吧!竟然想了解 首先必须清楚什么叫单词边界!我们可以以\b为分割来探究一下 单词边界 import java.util.regex.Matcher; import java.util.regex.Pattern; public class matcher1 { public ...

    正则表达式.docx

    “\b”匹配单词边界,不匹配任何字符。 “\b”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“\b”是零宽度的。 2.\w的范围 3.\b的范围 4.\b应用场景

    JS正则表达式大全

    做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa...

    正则表达式

    \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,...

    正则表达式大全

    \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,...

    regex-reference:正则表达式快速参考

    \b单词边界。 ? -从0前一个字符或一组匹配的一个时间一个最大值。 * -匹配从0到前一个字符或组的次数尽可能多。 + -将前一个字符或组从1匹配到尽可能多的次数。 {x,y} -从x中的前一个字符或一组相匹配的y倍的一个...

    正则表达式必知必会pdf

    位置匹配6.1 边界6.2 单词边界6.3 字符串边界6.4 小结第7章 使用子表达式7.1 什么是子表达式7.2 子表达式7.3 子表达式的嵌套7.4 小结第8章 回溯引用:前后一致匹配8.1 回溯引用有什么用8.2 回溯引用匹配8.3 回溯引用...

    java 正则表达式

    [正则表达式]文本框输入内容控制 ….. 默认分类 2009-02-13 10:10 阅读26 评论0 字号: 大大 中中 小小整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$"。只能输入n位的数字:"^\d{n}$"。只能输入...

    php中preg_match的isU代表什么意思

    isU是大小写分的意思,这里s还有则不包括换行符而U是反转了匹配数量的值使...preg_match 兼容的正则表达式语法中 b 代表单词边界 所以:下面应该是可以??? $a="test,admin,abc"; $b="te"; $exist=preg_match("/b{

    正则表达式教程

    &lt;br&gt;3.5 定位符 &lt;br&gt; 用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。 &lt;br&gt;3.6 选择 &lt;br&gt; 用圆括号将所有选择项...

    JS正则表达式大全(整理详细且实用)

    \ 做为转意,即通常在”\”后面的字符不按原来意义解释,如/b/匹配字符”b”,当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如”*”匹配它前面元字符0次或多次,/a*/将...

    JavaScript 正则表达式使用详细参数

    正则表达式中的特殊字符: 字符 含意 \ 转意,即通常在”\”后面的字符不按原来意义解释,如/b/匹配字符”b”,当b前面加了反斜杆后/\b/,转意为 匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如...

    Java中的正则表达式 -- 示例详解

    \B 一个非单词的边界 \G 前一个匹配的结束 ^为限制开头 ^java 条件限制为以Java为开头字符 $为限制结尾 java$ 条件限制为以java为结尾字符 .为限制一个任意字符 java.. 条件限制为java后除换行外任意两个字符 ...

    Python——正则表达式笔记整理…

    正则表达式到底是什么东西? 1.在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码...匹配单词的边界

    PHP100视频教程 37:PHP中正则表达式学习及应用(二).rar

    \b 匹配单词边界,边界可以是空格或者特殊符合 \B 匹配除带单词边界意外内容 {m} 匹配前一个内容的重复次数为M次 {m,} 匹配前一个内容的重复次数大于等于M次 {m,n} 匹配前一个内容的重复次数M次到N次 ( ) 合并...

    常见的正则表达式问题

    \b匹配一个单词边界, ?: ?= ?! 这四个不加^和$,其他都加^和$。 关于|的理解 1:/^a|zood$/ 当前面是a后面不管是什么都好使 当后面是zood前面不管是什么都好使 2:/^(a|z)ood$/ 结果是 aood zood 以上内容是小编给...

    JSP判断移动设备的正则

    看到了一篇很好的文章, 《在天猫,前端做什么?》,里面有天猫php判断移动设备的正则(个人猜测),觉得很好用,于是就决定移植到JSP里面。 jsp文件名为 index.jsp... // \b 是单词边界(连着的两个(字母字符 与 非字母字符)

    Python核心编程 第二版

    15.2.3 从字符串的开头或结尾或单词边界开始匹配(^/$ /\b /\B ) 15.2.4 创建字符类([]) 15.2.5 指定范围(-)和否定(^) 15.2.6 使用闭包操作符(*,+,?,{})实现多次出现/重复匹配 15.2.7 特殊字符表示...

Global site tag (gtag.js) - Google Analytics