regex 正则表达式反向匹配

kgsdhlau  于 2023-03-04  发布在  其他
关注(0)|答案(3)|浏览(150)

我有一根绳子

string: Octane_2022.1.0.6_Houdini_19.5.493_OSX.zip

和正则表达式

regex_search('[0-9]{2}.[0-9]')

这将得到2022年。预期结果是19.5,无论该字段中有什么。
本质上,我需要总是收集这个安装程序的基本版本号。当里面没有年份时,它工作得很好,但是我如何强迫我的正则表达式只在它是2位数+“.”+ 1位数时才得到它呢?

ozxc1zmp

ozxc1zmp1#

声明变量

version_regex: '^\d{2}\.\d{1}.*$'
  version: "{{ string|
               split('_')|
               select('regex', version_regex)|first }}"
  major: "{{ version|split('.')|first }}"
  major_minor: "{{ version|splitext|first }}"
  patch: "{{ version|split('.')|last }}"

给予

version: 19.5.493
  major: 19
  major_minor: 19.5
  patch: 493

详情:
给定字符串

string: Octane_2022.1.0.6_Houdini_19.5.493_OSX.zip

拆分字符串

arr: "{{ string|split('_') }}"

给予

arr:
  - Octane
  - 2022.1.0.6
  - Houdini
  - 19.5.493
  - OSX.zip

选择 "为2位+'.'+1位的项目"

version: "{{ arr|select('regex', version_regex)|first }}"
  version_regex: '^\d{2}\.\d{1}.*$'

给予

version: 19.5.493

如果版本的格式是语义版本化(主要版本、次要版本、补丁),则拆分项目

major: "{{ version|split('.')|first }}"
  major_minor: "{{ version|splitext|first }}"
  patch: "{{ version|split('.')|last }}"

给予

major: 19
    major_minor: 19.5
    patch: 493

完整的测试行动手册示例

- hosts: localhost

  vars:

    string: Octane_2022.1.0.6_Houdini_19.5.493_OSX.zip
    arr: "{{ string|split('_') }}"
    version_regex: '^\d{2}\.\d{1}.*$'
    # version: "{{ arr|select('regex', version_regex)|first }}"
    version: "{{ string|
                 split('_')|
                 select('regex', version_regex)|first }}"
    major: "{{ version|split('.')|first }}"
    major_minor: "{{ version|splitext|first }}"
    patch: "{{ version|split('.')|last }}"
    # major_minor: "{{ version|split('.')[:2]|join('.') }}"

  tasks:

    - debug:
        var: arr
    - debug:
        var: version

    - debug:
        msg: |
          major: {{ major }}
          major_minor: {{ major_minor }}
          patch: {{ patch }}
1qczuiv0

1qczuiv02#

你可以用这个正则表达式

Octane_(.*(?=\_Houdini))_Houdini_(.*(?=\_))

它将返回两组值

  • 年份:x1月1x日
  • 版本:19.5.493

这个正则表达式是如何工作的

(?=\_)

使用正向前查找匹配所需的标识符,在本例中,第一组为_Houdini,第二组为_

js81xvg6

js81xvg63#

我们可以通过使用前瞻来向后工作:

(?<=_)\d{2}\.\d(?=\.\d+_[A-Z]+\.zip)

它只匹配前面有下划线的字符串,然后查找两个数字,接着是".",然后是一个数字,并且只匹配前面有另一个点、一个或多个数字、下划线、几个大写字母,然后是文字".zip"的字符串。
Try it .

相关问题