mirror of
				https://github.com/ansible-collections/community.general.git
				synced 2025-10-24 21:14:00 -07:00 
			
		
		
		
	regex_escape: support POSIX basic regex (#50327)
This commit is contained in:
		
					parent
					
						
							
								874fd70d10
							
						
					
				
			
			
				commit
				
					
						e55e8fe2c4
					
				
			
		
					 3 changed files with 31 additions and 3 deletions
				
			
		
							
								
								
									
										8
									
								
								changelogs/fragments/regex-escape-basic.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								changelogs/fragments/regex-escape-basic.yaml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| minor_changes: | ||||
| - | | ||||
|     regex_escape - added re_type option to enable escaping POSIX BRE chars | ||||
| 
 | ||||
|     This distinction is necessary because escaping non-special chars such as | ||||
|     '(' or '{' turns them into special chars, the opposite of what is intended | ||||
|     by using regex_escape on strings being passed as a Basic Regular | ||||
|     Expression. | ||||
|  | @ -1075,11 +1075,18 @@ To replace text in a string with regex, use the "regex_replace" filter:: | |||
| 
 | ||||
| .. versionadded:: 2.0 | ||||
| 
 | ||||
| To escape special characters within a regex, use the "regex_escape" filter:: | ||||
| To escape special characters within a standard python regex, use the "regex_escape" filter (using the default re_type='python' option):: | ||||
| 
 | ||||
|     # convert '^f.*o(.*)$' to '\^f\.\*o\(\.\*\)\$' | ||||
|     {{ '^f.*o(.*)$' | regex_escape() }} | ||||
| 
 | ||||
| .. versionadded:: 2.8 | ||||
| 
 | ||||
| To escape special characters within a POSIX basic regex, use the "regex_escape" filter with the re_type='posix_basic' option:: | ||||
| 
 | ||||
|     # convert '^f.*o(.*)$' to '\^f\.\*o(\.\*)\$' | ||||
|     {{ '^f.*o(.*)$' | regex_escape('posix_basic') }} | ||||
| 
 | ||||
| 
 | ||||
| Kubernetes Filters | ||||
| `````````````````` | ||||
|  |  | |||
|  | @ -185,9 +185,22 @@ def ternary(value, true_val, false_val, none_val=None): | |||
|         return false_val | ||||
| 
 | ||||
| 
 | ||||
| def regex_escape(string): | ||||
| def regex_escape(string, re_type='python'): | ||||
|     '''Escape all regular expressions special characters from STRING.''' | ||||
|     return re.escape(string) | ||||
|     if re_type == 'python': | ||||
|         return re.escape(string) | ||||
|     elif re_type == 'posix_basic': | ||||
|         # list of BRE special chars: | ||||
|         # https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions | ||||
|         return regex_replace(string, r'([].[^$*\\])', r'\\\1') | ||||
|     # TODO: implement posix_extended | ||||
|     # It's similar to, but different from python regex, which is similar to, | ||||
|     # but different from PCRE.  It's possible that re.escape would work here. | ||||
|     # https://remram44.github.io/regex-cheatsheet/regex.html#programs | ||||
|     elif re_type == 'posix_extended': | ||||
|         raise AnsibleFilterError('Regex type (%s) not yet implemented' % re_type) | ||||
|     else: | ||||
|         raise AnsibleFilterError('Invalid regex type (%s)' % re_type) | ||||
| 
 | ||||
| 
 | ||||
| def from_yaml(data): | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue