文章目录
- 定义
- (?=pattern) 正向先行断言
- (?!pattern) 负向先行断言
- (?<=pattern) 正向后行断言
- (?<!pattern) 负向后行断言
- 实际应用举例
- 不以 test 开头的字符串
- `grub.cfg` 中不以`hugepages=30"`结尾的字符串
定义
正则表达式中 look-around ( look-ahead 和 look-behind ) 用来判断字符串前后是否满足给定条件;类似于编程中的断言,也可以叫做预查,因人而异。
look-around 不捕获文本 ,不对组合计进行计数,只进行判断并返回匹配条件的结果
主要分为:
- (?=pattern) positive look-ahead assertion(正向先行断言)
- (?!pattern) negative look-ahead assertion(负向先行断言)
- (?<=pattern) positive look-behind assertion(正向后行断言)
- (?<!pattern) negative look-behind assertion(负向后行断言)
(?=pattern) 正向先行断言
exp1(?=exp2)
:查找 exp2 前面的 exp1,结果只返回 exp1 所匹配的内容
例如:匹配 gular 前面的 re (而不会匹配 expression 中的 re)
(?!pattern) 负向先行断言
exp1(?!exp2)
:查找后面不是 exp2 的 exp1
例如:不匹配 regular 中的 re
(?<=pattern) 正向后行断言
(?<=exp2)exp1
:查找 exp2 后面的 exp1
例如:匹配位于 exp 后面的 re
(?<!pattern) 负向后行断言
(?<!exp2)exp1
:查找前面不是 exp2 的 exp1
例如:匹配不是 exp 后面的 re
实际应用举例
按照上文所述,四种断言情况都需要两个表达式(exp)来组成;
所以编写正则表达式时,应先将需求拆分成两个表达式,就能写出符合需求的正则。
不以 test 开头的字符串
拆分需求:①开头(^
)② test
,在①后面不是②,所以应该是^(?!test).*
(负向先行断言),在线查看结果
grub.cfg
中不以hugepages=30"
结尾的字符串
这个可以用来判断 Linux 系统中大页内存是否配置,配合配置大页内存的 ansible 脚本使用。
拆分需求:①结尾($
)②hugepages=30"
,所以应该是 .*(?<!hugepages=30")$
(负向后行断言),在线查看结果
附:使用 ansible task 配置大页内存(仅作个人记录)
- name: Modify /etc/default/grub for HugePage configuration
vars:
MemConfig: "{{ ansible_memtotal_mb//1024 - hugepage_reserved | int }}"
lineinfile:
path: /etc/default/grub
regex: '(^GRUB_CMDLINE_LINUX.*)(?<!hugepages={{ MemConfig }})"$'
line: '\1 default_hugepagesz=1G hugepagesz=1G hugepages={{ MemConfig }}"'
backrefs: yes
become: True
register: hugepage_configured
when: custom_hugepage | bool
- name: Config HugePage Memory
shell: |
if [[ `lsblk | grep efi` ]] ;then
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
else
grub2-mkconfig -o /boot/grub2/grub.cfg
fi
become: True
when:
- custom_hugepage | bool
- hugepage_configured.changed is true