#Linux杂记#关于正则表达式单词边界的匹配问题的剖析

在使用正则表达式的时候,会遇到需要精准匹配某些字符的情况,这时候 \b \B 就派上用场了。若是不理解这两个正则表达式元字符,用起来便不会得心应手。本文介绍如何使用它们。

1. \b 和 \B 的含义


这两个元字符的含义看起来非常官方,但却又非常准确。理解之后就会发现它们概括的言简意赅,一点废话都没有,但却需要细细品味。

要想理解这两个元字符,需要明确两个概念:

单词:说到单词,又涉及到一个元字符\w,如上表所述,\w表示一个字母数字或下划线。而单词,正是由若干\w组成的,也就是任意字母数字的组合。
边界:在正则表达式里面,边界不是特定的字符,而是一个不存在的东西,一个概念。可以说是\b \B代表的东西,边界是任何两个字符之间的那个东西。
明确这两个概念之后,下面就可以说明 \b \B 代表的含义了。

\b 单词边界:    匹配一个边界,一边字符是\w,一边字符不是\w
\B 非单词边界:匹配除 \b 之外的边界。两边字符都是\w,或两边字符都不是\w

这里先下一个定义,用正则表达式的语言表达:

字符是\w:\w
字符不是\w:[^\w]
如下图所示,图中所有虚竖线都是边界。

在这里插入图片描述

上图中,每个边界都满足:一边是\w,一边是[^\w]。即:

左边是\w,右边是[^\w]
左边是[^\w],右边是\w

在这里插入图片描述

\B 就是除 \b 之外的所有边界。\b表示一边是\w,一边是[^\w]的边界,那么取反,即:

两边都是\w
两边都是[^\w]

简言之: 

边界类型    左侧字符    右侧字符
\b    \w    [^\w]
\b    [^\w]    \w
\B    \w    \w
\B    [^\w]    [^\w]
用字符是 \w 代表 1,字符是[^\w]代表 0,那么用计算机的逻辑思维理解就是:

边界类型    左侧字符    右侧字符
\b    1    0
\b    0    1
\B    1    1
\B    0    0
两个二进制数的表示也就这四种情况。因此,可得到如下结论:

\b 代表的边界,左右字符类型不相同
\B 代表的边界,左右字符类型相同
注意:这里指的字符类型只包括两种(是\w 、不是\w)。其它都可以忘掉,只要记住这两个结论就可以了。

看到这,应该能从上面的图表中理解什么是单词边界\b,什么是非单词边界\B了。

2. 用法示例

这里根据第1节得出的结论:

\b 代表的边界,左右字符类型不相同
\B 代表的边界,左右字符类型相同
结合几个示例进行分析。

2.1 简单示例

2.1.1 示例1

对于模式\bat\b中的第一个\b,由于其右侧是\w,那么其左侧必须是[^\w];
对于模式\bat\b中的第二个\b,由于其左侧是\w,那么其右侧必须是[^\w];
因此匹配结果如图所示。

在这里插入图片描述

2.1.2 示例2

对于模式\Bat\b中的\B,由于其右侧是\w,那么其左侧也必须是\w;
对于模式\Bat\b中的\b,由于其左侧是\w,那么其右侧必须是[^\w];
因此匹配结果如图所示。

在这里插入图片描述

2.1.3 示例3

对于模式\Bat\B中的第一个\B,由于其右侧是\w,那么其左侧也必须是\w;
对于模式\Bat\B中的第二个\B,由于其左侧是\w,那么其右侧也必须是\w;
因此匹配结果如图所示。

在这里插入图片描述

2.1.4 示例4

对于模式\bat\B中的\b,由于其右侧是\w,那么其左侧必须是[^\w];
对于模式\bat\B中的\B,由于其左侧是\w,那么其右侧也必须是\w;
因此匹配结果如图所示。

在这里插入图片描述

2.2 复杂示例

能看懂上面的简单示例的话,理解下面的就不难了。

2.2.1 示例5

由于%是[^\w],因此匹配结果两侧的字符也应该是[^\w]

在这里插入图片描述
这个不用说应该就能懂了。

 在这里插入图片描述

2.2.2 示例6

在这里插入图片描述

根据两个\B,目标的 thank 左右两侧应该都是\w

在这里插入图片描述
根据\b,r左侧应该是[^\w];根据\B,=右侧应该是[^\w]

在这里插入图片描述
由于r是\w,根据\b,r左侧应该是[^\w];
由于=是[^\w],根据\b,=右侧应该是\w;
字符串中两个regex==均不满足左侧是[^\w],右侧是\w,因此匹配失败。

在这里插入图片描述
字符串中第二个regex==满足左侧是\w,右侧是\w,因此匹配成功。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux上安装Wayland,你可以按照以下步骤进行操作: 1. 确保你已经安装了所需的支持库。可以使用以下命令安装所需的库: ``` sudo apt install libwayland-dev libegl1-mesa-dev libglm-dev wayland-protocols libwayland-bin extra-cmake-modules ``` 2. 编写一个Hello Wayland的C++程序。你可以创建一个名为hellowayland.cpp的文件,并在其中添加以下代码: ```cpp #include <wayland-server.h> #include <wayland-client.h> #include <iostream> using namespace std; int main(){ cout<<"Hello wayland"<<endl; } ``` 3. 编写一个Makefile来编译程序。你可以创建一个名为Makefile的文件,并在其中添加以下内容: ```makefile all: g++ -o hellowayland.out hellowayland.cpp -lwayland-client -lwayland-server -lwayland-cursor -lwayland-egl ``` 4. 使用CMake来生成Makefile。你可以运行以下命令来生成Makefile: ``` cmake . ``` 5. 使用make命令来编译程序。你可以运行以下命令来编译程序: ``` make ``` 6. 运行程序。你可以运行以下命令来运行程序: ``` ./hellowayland.out ``` 这样,你就可以在Linux上成功安装和运行Wayland了。请注意,这只是一个简单的示例,你可以根据自己的需求进行更复杂的开发。 #### 引用[.reference_title] - *1* *2* [Linux 音视频开发杂记之三-wayland环境搭建](https://blog.csdn.net/u010359310/article/details/127874975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [archlinux安装,wayland环境Hyprland桌面](https://blog.csdn.net/weixin_45381257/article/details/130569290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值