【问题标题】:Strange error in Ansible regarding regexAnsible 中关于正则表达式的奇怪错误
【发布时间】:2017-04-25 12:23:57
【问题描述】:
replace:
    path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php"
    regexp: '(\s+)(\'database\' => \'{{ drupal.database_name }}\',)$'
    replace: '\1\2\n\1\'charset\' => \'utf8mb4\',\n\1\'collation\' => \'utf8mb4_unicode_ci\','

但是报错:

path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php"
regexp: '(\s+)(\'database\' => \'{{ drupal.database_name }}\',)$'
                 ^ here

但它适用于https://regex101.com/

【问题讨论】:

  • 错误内容在哪里?为什么不简单地将整个表达式用双引号括起来呢?而不是逃避单个的。
  • @techraf 我认为双引号不起作用(至少对我来说不是,我已经尝试过,所有示例都是单引号)。错误内容是我给你看的,只是一些垃圾。基本上说有语法错误。如果我翻转正则表达式并替换,则错误出现在替换中,就在转义单引号旁边

标签: regex ansible yaml


【解决方案1】:

使用双引号(然后你需要重复反斜杠):

replace:
    path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php"
    regexp: "(\\s+)('database' => '{{ drupal.database_name }}',)$"
    replace: "\\1\\2\\n\\1'charset' => 'utf8mb4',\\n\\1'collation' => 'utf8mb4_unicode_ci',"

【讨论】:

  • 谢谢,这更清楚了。你知道如何让这个“只适用一次”吗?
  • 什么意思?
  • 如果我多次运行它,我会多次添加“替换”......好吧,它甚至不是替换,它更像是一个附加(如果你看一下正则表达式,我会捕捉到行并再放两行)
  • 这就是你写正则表达式的方式,不是吗?如果您将结果复制到 regex101 中的源并重试,您不会得到重复的内容吗?
【解决方案2】:

我找到了解决方法:

replace:
        path: "{{ drupal.install_dir }}/{{ drupal.project_name }}/sites/default/settings.php"
        regexp: '^(\s+)(\x27database\x27 => \x27{{ drupal.database_name }}\x27,)$'
        replace: '\1\2\n\1"charset" => "utf8mb4",\n\1"collation" => "utf8mb4_general_ci",'

幸运的是,我可以交换双引号和单引号(PHP 数组)。 \x27 解决方法在替换中不起作用,但在正则表达式中起作用。 (\x27 = ')

【讨论】:

    【解决方案3】:

    single quote style scalar 中,您必须使用额外的单引号“转义”作为该标量一部分的任何单引号:

       regexp: '(\s+)(\''database\'' => \''{{ drupal.database_name }}\'',)$'
       replace: '\1\2\n\1\''charset\'' => \''utf8mb4\'',\n\1\''collation\'' => \''utf8mb4_unicode_ci\'','
    

    在这些单引号样式标量中,不需要(或可以)转义其他字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多