diff --git a/docsite/rst/playbooks_filters.rst b/docsite/rst/playbooks_filters.rst index 2f9e83c288..d95f617f19 100644 --- a/docsite/rst/playbooks_filters.rst +++ b/docsite/rst/playbooks_filters.rst @@ -401,6 +401,11 @@ To replace text in a string with regex, use the "regex_replace" filter:: .. note:: If "regex_replace" filter is used with variables inside YAML arguments (as opposed to simpler 'key=value' arguments), then you need to escape backreferences (e.g. ``\\1``) with 4 backslashes (``\\\\``) instead of 2 (``\\``). +To escape special characters within a regex, use the "regex_escape" filter:: + + # convert '^f.*o(.*)$' to '\^f\.\*o\(\.\*\)\$' + {{ '^f.*o(.*)$' | regex_escape() }} + A few useful filters are typically added with each new Ansible release. The development documentation shows how to extend Ansible filters by writing your own as plugins, though in general, we encourage new ones to be added to core so everyone can make use of them. diff --git a/lib/ansible/plugins/filter/core.py b/lib/ansible/plugins/filter/core.py index e8e3e17f77..b8b506e508 100644 --- a/lib/ansible/plugins/filter/core.py +++ b/lib/ansible/plugins/filter/core.py @@ -222,6 +222,10 @@ def version_compare(value, version, operator='eq', strict=False): except Exception, e: raise errors.AnsibleFilterError('Version comparison: %s' % e) +def regex_escape(string): + '''Escape all regular expressions special characters from STRING.''' + return re.escape(string) + @environmentfilter def rand(environment, end, start=None, step=None): r = SystemRandom() @@ -356,6 +360,7 @@ class FilterModule(object): 'search': search, 'regex': regex, 'regex_replace': regex_replace, + 'regex_escape': regex_escape, # ? : ; 'ternary': ternary,