文章目录

  • 定义
  • (?=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)

在线查看结果

java 正则不以某些字符开头 正则 不以什么开头_java 正则不以某些字符开头

(?!pattern) 负向先行断言

exp1(?!exp2):查找后面不是 exp2 的 exp1

例如:不匹配 regular 中的 re

在线查看结果

java 正则不以某些字符开头 正则 不以什么开头_java 正则不以某些字符开头_02

(?<=pattern) 正向后行断言

(?<=exp2)exp1:查找 exp2 后面的 exp1

例如:匹配位于 exp 后面的 re

在线查看结果

java 正则不以某些字符开头 正则 不以什么开头_Memory_03

(?<!pattern) 负向后行断言

(?<!exp2)exp1:查找前面不是 exp2 的 exp1

例如:匹配不是 exp 后面的 re

在线查看结果

java 正则不以某些字符开头 正则 不以什么开头_java 正则不以某些字符开头_04

实际应用举例

按照上文所述,四种断言情况都需要两个表达式(exp)来组成;
所以编写正则表达式时,应先将需求拆分成两个表达式,就能写出符合需求的正则。

不以 test 开头的字符串

拆分需求:①开头(^)② test,在①后面不是②,所以应该是^(?!test).*(负向先行断言),在线查看结果

java 正则不以某些字符开头 正则 不以什么开头_正则表达式_05

grub.cfg 中不以hugepages=30"结尾的字符串

这个可以用来判断 Linux 系统中大页内存是否配置,配合配置大页内存的 ansible 脚本使用。

拆分需求:①结尾($)②hugepages=30",所以应该是 .*(?<!hugepages=30")$ (负向后行断言),在线查看结果

java 正则不以某些字符开头 正则 不以什么开头_Memory_06

附:使用 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