我正在尝试使用regex_replace命令提取子字符串我想在这里提取“ SWIFTInward”

问题描述

我在Ansible中尝试了以下代码

---
- hosts: windows
  strategy: linear

  vars:
    war_file_path: F:\\Install\\IIBProjects\\DE\\WAR\\DE_SWIFTInward-202010.0.0.war

  tasks:
    - name: Get properties folder path for windows
      set_fact:
        endpointDetails: "{{ item | win_basename | regex_replace('\\\\(?:(?!\\\\).)*$','') }}"
      with_items:
        - "{{ war_file_path }}"
      register: war_file_name
      when: ansible_os_family == "Windows"

期望输出SWIFTInward
我得到的错误输出DE_SWIFTInward-202010.0.0.war

解决方法

win_basename返回不带目录详细信息的文件名。因此,您的正则表达式与之不匹配,因为它在开始时需要\

您需要

endpointDetails: "{{ item | win_basename | regex_replace('^[^_]*_([^_-]+).*','\\1') }}"

请参见regex demo

或者,将regex_search与简单的_([^_-]+)- regex结合使用:

endpointDetails: "{{ item | win_basename | regex_search('(?<=_)[^_-]+') }}"

详细信息

  • ^[^_]*_([^_-]+).*
    • ^-字符串的开头
    • [^_]*-除_以外的零个或多个字符
    • _-一个_字符
    • ([^_-]+)-第1组(\1):除_-以外的一个或多个字符
    • .*-字符串的其余部分。
  • (?<=_)[^_-]+
    • (?<=_)-字符串中紧邻_
    • 的位置
    • [^_-]+-除_-以外的一个或多个字符。