我正在尝试使用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):除_-以外的一个或多个字符
    • .*-字符串的其余部分。
  • (?<=_)[^_-]+
    • (?<=_)-字符串中紧邻_
    • 的位置
    • [^_-]+-除_-以外的一个或多个字符。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...