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