0

我有以下来自 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>

还有另一种方法可以做到这一点,一种不那么hacky的方法吗?我希望有一个解决方案,我可以只提供一个正则表达式字符串,然后简单地查找与正则表达式字符串匹配的字符之外的所有内容。

4

1 回答 1

1

使用String#gsub并用 . 否定可接受字符的字符类[^...]

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" 

+如果要将多个连续的无效字符替换为单个空格,请添加 a 。

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 " 
于 2021-01-15T02:24:18.470 回答