正则表达式 不以 字符串 开头结尾 (前后预查) look around

定义

正则表达式中 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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

某呆啊

赏个糖吃吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值