`

正则基础之——\b 单词边界

阅读更多

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

 

 view plaincopy to clipboardprint?
<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 
<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#


view plaincopy to clipboardprint?
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汉字 
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

 

 

view plaincopy to clipboardprint?
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 
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.

JavaScript


view plaincopy to clipboardprint?
<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汉 
<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#


view plaincopy to clipboardprint?
string test = "abc_123中文_d3=efg汉字%";  
MatchCollection mc = Regex.Matches(test, @".\b.");  
foreach (Match m in mc)  
{  
    richTextBox2.Text += m.Value + "\n";  
}  
 
//C#中输出  
3=  
字% 
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

view plaincopy to clipboardprint?
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=  
字% 
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”显然不在替换的范围内,所以正则可以用“\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     进阶应用
稍复杂一些的应用通常都是与其它一些正则语法规则一起使用的,参考一个帖子

求一正则表达式

4.3     特殊情况
“\b”用在正则中,通常情况下都是表示单词边界的,只有在字符组中,它表示的是退格键,即

[a-z\b]

此处的“\b”表示的是退格键,而不是单词边界。

分享到:
评论

相关推荐

    正则匹配原理之——逆序环视深入.rar

    - **断言**:如`^`表示行首,`$`表示行尾,`\b`表示单词边界。 2. 逆序环视的概念 - 逆序环视分为四种类型:`(?&lt;!...)`(否定前瞻)、`(?!...)`(肯定前瞻)、`(?)`(否定后瞻)和`(?=...)`(肯定后瞻)。 - ...

    正则表达式系统教程——学习正则的最简单的教程

    在教程中,你会了解到如何使用边界匹配器,比如"^"表示行的开始,"$"表示行的结束,"\b"用来匹配单词边界。这有助于我们在特定的位置进行匹配,防止匹配到不期望的文本。 量词是正则表达式的另一个关键特性,它们...

    Java正则表达式——知识积累

    在进行匹配操作时,我们还可以使用预定义的边界匹配器,如`^`表示字符串的开始,`$`表示字符串的结束,`\b`表示单词边界等。例如,`\b[A-Z]+\b`可以匹配全大写字母的单词。 除了基本的匹配,Java正则表达式还支持...

    正则表达式之道

    ### 正则表达式之道 —— Java中的应用与实践 #### 一、引言 正则表达式是一种强大的文本处理工具,它可以帮助开发者快速高效地完成字符串的匹配、搜索、替换等工作。对于Java开发者而言,掌握正则表达式的用法尤...

    【python】——正则表达式(csdn)————程序.pdf

    - `\b`:匹配单词边界,用于精确匹配单词。 4. **组**: - `( )`:用于创建分组,可以捕获匹配的部分,方便后续处理。 二、方法 - `re.findall(pattern, string)`:查找所有匹配项,并返回一个列表。 - `re....

    正则表达式.docx

    #### 二、“\b”——匹配单词边界 “\b”用于匹配单词边界,这里的“单词”通常指的是由字母、数字或下划线组成的一段连续字符。需要注意的是,“\b”并不匹配任何实际字符,它只表示一个位置。这个位置的一侧是...

    详细的C#正则表达式基础教程

    - `\B`:匹配非单词边界。 10. **其他特殊字符** - `\`:用于转义特殊字符,如`\.`表示匹配实际的点字符,而非任何字符。 - `|`:用于定义或选择,如`cat|dog`匹配"cat"或"dog"。 - `(?:...)`:非捕获组,不...

    Python基础——正则表达式

    - `\B`:匹配非单词边界 - `.`:匹配除换行符`\n`之外的任何字符 - `^`:匹配字符串的开始 - `$`:匹配字符串的结束 - `?`:使前面的字符变得可选 5. **重复匹配** 正则表达式支持重复匹配,使用`*`、`+`、`{...

    python专题——正则表达式[整理].pdf

    - `\B`:非字边界,用于匹配单词内部。 6. **选择与分组**: - 使用 `|` 分隔多个选择项,正则表达式会尝试匹配其中任意一个。 - `( )` 用于创建捕获组,捕获的子匹配可以使用反向引用(`\n`,n 为组号)来引用...

    Delphi 版的 正则表达式 RegEx

    4. 边界:"\b"表示单词边界,"\B"表示非单词边界。 5. 分组:"(...)"用来捕获子表达式,方便后续操作。 6. 预查和后顾:像"(?=...)"表示正向前瞻,"(?!...)"表示负向前瞻,"(?)"表示正向后顾,"(?&lt;!...)"表示负向后...

    python专题——正则表达式借鉴.pdf

    6. 字边界:字边界是单词和空格之间的位置。非字边界是任何其他位置。例如:/\bCha/ \b 字符的位置是非常重要的。如果它位于匹配字符串的开始,它在单词开始处查找匹配项。如果位于字符串的结尾,他在单词的结尾处...

    (生成正则工具)SetupRegex.zip

    - **边界匹配**:`^` 匹配行首,`$` 匹配行尾,`\b` 匹配单词边界。 Regex Buddy提供了一种友好的界面,让用户可以直观地看到正则表达式的匹配过程,支持多种正则表达式语法,如Perl、Java、.NET等,并提供了测试...

    正则表达式的基础语法

    ### 正则表达式的基础语法 #### 概述 正则表达式是一种强大的文本处理工具,可以在字符串中执行复杂的搜索和替换操作。它提供了一种描述字符串模式的方式,这种模式可以用来检查一个字符串是否符合某种特定类型的...

    regexp正则表达式正则表达式正则表达式

    - **`\B`**:匹配非单词边界。 #### 三、正则表达式的应用案例 正则表达式在实际开发和日常工作中有着广泛的应用: ##### 3.1 文本搜索 使用正则表达式可以快速地在大量文本中查找特定的模式。例如,在日志文件中...

    正则表达式介绍

    正则表达式还支持边界匹配,这包括单词边界(`\b`)和行边界(`^`和`$`),用于匹配特定位置的字符。 #### 六、匹配子模式与预查 子模式通过圆括号`()`定义,用于捕获和重用匹配的文本。预查(lookahead)和后查...

    正则表达式应用总结

    5. **边界匹配**:如`\b`用于匹配单词边界。 6. **选择匹配**:通过`|`符号实现,表示“或”的关系。 #### 三、Java中的特殊处理 在Java中,由于反斜线`\`具有特殊的意义,因此在使用正则表达式时需要额外注意对...

    c#正则表达式整理验证数据和邮箱

    - **边界匹配**:^表示行首,$表示行尾,\b表示单词边界,\B表示非单词边界。 - **分组与捕获**:使用小括号()可以创建一个捕获组,用于获取匹配的部分。 2. **C#中的Regex类** - **构造函数**:如`new Regex...

    正则表达式入门

    - **`\b`**:匹配单词边界,即单词的开始或结束的位置。 - **`^`**:匹配字符串的开始。 - **`$`**:匹配字符串的结束。 - **`[]`**:字符集,匹配括号内的任一字符。 - **`[a-z]`**:匹配小写字母a到z之间的任意一...

    正则表达式_字符使用说明

    - **边界限定**:结合单词边界 `\b` 使用,可以确保匹配的是完整的单词而不是单词的一部分。 - **自定义范围**:如果需要匹配特定的字符集,可以使用自定义的字符范围,如 `[a-zA-Z0-9_]`。 #### 总结 通过本文的...

Global site tag (gtag.js) - Google Analytics