Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 替换不带';不匹配特定的正则表达式_Ruby - Fatal编程技术网

Ruby 替换不带';不匹配特定的正则表达式

Ruby 替换不带';不匹配特定的正则表达式,ruby,Ruby,我有来自Amazon Web Services(AWS)的以下正则表达式,它是实例名称所必需的: ^([\p{L}\p{Z}\p{N}_.:/=+-@]*)$ 但是,我不确定是否有更有效的方法来查找与此字符串不匹配的字符,并将其替换为一个简单的空格字符 例如,字符串Hello(World)应替换为Hello World(括号已替换为空格)。这只是与此字符串不匹配的字符的众多示例之一 我能够做到这一点的唯一方法是使用以下代码: first_test_string.split('').each d

我有来自Amazon Web Services(AWS)的以下正则表达式,它是实例名称所必需的:

^([\p{L}\p{Z}\p{N}_.:/=+-@]*)$
但是,我不确定是否有更有效的方法来查找与此字符串不匹配的字符,并将其替换为一个简单的空格字符

例如,字符串
Hello(World)
应替换为
Hello World
(括号已替换为空格)。这只是与此字符串不匹配的字符的众多示例之一

我能够做到这一点的唯一方法是使用以下代码:

first_test_string.split('').each do |char|
    if char[/^([\p{L}\p{Z}\p{N}_.:\/=+-@]*)$/] == nil
        second_test_string = second_test_string.gsub(char, " ")
    end
end
使用此代码时,我得到以下结果:

irb(main):037:0> first_test_string = "Hello (World)"
=> "Hello (World)"
irb(main):038:0> second_test_string = first_test_string
=> "Hello (World)"
irb(main):039:0>
irb(main):040:0> first_test_string.split('').each do |char|
irb(main):041:1*     if char[/^([\p{L}\p{Z}\p{N}_.:\/=+-@]*)$/] == nil
irb(main):042:2>         second_test_string = second_test_string.gsub(char, " ")
irb(main):043:2>     end
irb(main):044:1> end
=> ["H", "e", "l", "l", "o", " ", "(", "W", "o", "r", "l", "d", ")"]
irb(main):045:0> first_test_string
=> "Hello (World)"
irb(main):046:0> second_test_string
=> "Hello  World "
irb(main):047:0>
有没有其他方法可以做到这一点,一个不那么烦人的方法?我希望找到一个解决方案,在这个解决方案中,我可以只提供一个正则表达式字符串,然后只查找与正则表达式字符串匹配的字符以外的所有字符。

使用
[^…]
来否定可接受字符的数量

2.6.5 :014 > "Hello (World)".gsub(%r{[^\p{L}\p{Z}\p{N}_.:/=+\-@]}, " ")
 => "Hello  World " 
注意,我还转义了
-
,因为
[+-@]
可能被解释为
+
@
之间的字符范围。例如,
位于
+
@
之间

2.6.5 :004 > "Hello, World".gsub(%r{[^\p{L}\p{Z}\p{N}_.:/=+-@]+}, " ")
 => "Hello, World" 
2.6.5 :005 > "Hello, World".gsub(%r{[^\p{L}\p{Z}\p{N}_.:/=+\-@]+}, " ")
 => "Hello  World" 
如果希望用单个空格替换多个连续的无效字符,请添加一个
+

2.6.5 :024 > "((Hello~(World)))".gsub(%r{[^\p{L}\p{Z}\p{N}_.:/=+\-@]}, " ")
 => "  Hello  World   " 
2.6.5 :025 > "((Hello~(World)))".gsub(%r{[^\p{L}\p{Z}\p{N}_.:/=+\-@]+}, " ")
 => " Hello World " 

谢谢。这就成功了!