正则基础之 \b 单词边界

 更新时间:2023年05月28日 12:03:45   作者:过客  
这篇文章主要介绍了正则基础之 \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

<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字符。

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

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”表示的是退格键,而不是单词边界。

到此这篇关于正则基础之 \b 单词边界的文章就介绍到这了,更多相关正则 单词边界内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux下的通配符与正则表达式

    linux下的通配符与正则表达式

    正则表达式是在文件中匹配符合条件的字符串的。下面通过本文给大家介绍linux下的通配符与正则表达式,需要的的朋友参考下吧
    2017-05-05
  • 正则表达式:过滤&lt;font&gt;和&lt;/font&gt;

    正则表达式:过滤&lt;font&gt;和&lt;/font&gt;

    正则表达式:过滤&lt;font&gt;和&lt;/font&gt;...
    2007-04-04
  • iOS中使用正则表达式NSRegularExpression 来验证textfiled输入的内容

    iOS中使用正则表达式NSRegularExpression 来验证textfiled输入的内容

    一个正则表达式(regexp)是由元字符和文字数字的文本字符,或者“文字的”(abc,123,及其他)混合组合而成的文本模式。 该类型用于匹配文本字符——并附有匹配的结果,是成功还是失败。 Regexps 主要用于规则文本匹配以及搜索和替换。
    2015-09-09
  • 最全最实用的正则表达式大全分享

    最全最实用的正则表达式大全分享

    正则式太难学,而且容易忘记 。很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求。所以我最近把开发中常用的一些正则表达式整理了一下,在这里分享一下。给自己留个底,也给朋友们做个参考。
    2015-10-10
  • 正则表达式预查的详细解释与应用实例

    正则表达式预查的详细解释与应用实例

    这几天在用正则表达式做一个小程序,需要替换内容中的某些特殊字符串。这些字符串的出现是有规律的,那就是在它左面总会特定的内容出现,右面却没有,下面这篇文章主要给大家介绍了关于正则表达式预查的详细解释与应用实例,需要的朋友可以参考下
    2022-09-09
  • JS 正则表达式的位置匹配

    JS 正则表达式的位置匹配

    JS中正则表达式的位置匹配代码,国外翻译的文章。
    2009-12-12
  • 轻松掌握正则表达式findall函数详解

    轻松掌握正则表达式findall函数详解

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等,这篇文章将带你掌握正则表达式中的findall函数
    2021-10-10
  • JavaScript 正则表达式(笔记)

    JavaScript 正则表达式(笔记)

    这篇文章主要介绍了JavaScript 正则表达式(笔记) ,这里总结了js中的一些正则的使用方法,需要的朋友可以参考下
    2015-04-04
  • js Abba逆向前瞻正则匹配实例

    js Abba逆向前瞻正则匹配实例

    这篇文章主要介绍了js Abba逆向前瞻正则匹配实例,主要是使用正则表达式的零宽断言进行判断,需要的朋友可以参考下
    2016-12-12
  • 去除段首段尾的 和全角的空格的正则

    去除段首段尾的 和全角的空格的正则

    去除段首段尾的 &nbsp;和全角的空格的正则,代码看起来不如之前的版本,简单,需要更了解正则的特殊字符。
    2009-08-08

最新评论