regex 在Ruby中,同一个单词的两个字母之间的空格的正则表达式是什么

z9smfwbn  于 2023-04-13  发布在  Ruby
关注(0)|答案(3)|浏览(130)

代码执行良好,但我缺少一个规范:在莫尔斯电码中,同一单词的字母之间的空格必须替换为空格。例如:hi在莫尔斯电码中是......(4点,空格,2点)....代码无法识别我在主散列中表示此分隔的方式--〉“”=〉““
有什么想法我错过了吗?谢谢
代码如下:

MASTER = { "A" => ".-",
           "B" => "-...",
           "C" => "-.-.",
           "D" => "-..",
           "E" => ".",
           "F" => "..-.",
           "G" => "--.",
           "H" => "....",
           "I" => "..",
           "J" => ".---",
           "K" => "-.-",
           "L" => ".-..",
           "M" => "--",
           "N" => "-.",
           "O" => "---",
           "P" => ".--.",
           "Q" => "--.-",
           "R" => ".-.",
           "S" => "...",
           "T" => "-",
           "U" => "..-",
           "V" => "...-",
           "W" => ".--",
           "X" => "-..-",
           "Y" => "-.--",
           "Z" => "--..",
           " " => "|",
           "a" => ".-",
           "b" => "-...",
           "c" => "-.-.",
           "d" => "-..",
           "e" => ".",
           "f" => "..-.",
           "g" => "--.",
           "h" => "....",
           "i" => "..",
           "j" => ".---",
           "k" => "-.-",
           "l" => ".-..",
           "m" => "--",
           "n" => "-.",
           "o" => "---",
           "p" => ".--.",
           "q" => "--.-",
           "r" => ".-.",
           "s" => "...",
           "t" => "-",
           "u" => "..-",
           "v" => "...-",
           "w" => ".--",
           "x" => "-..-",
           "y" => "-.--",
           "z" => "--..",
           "," => " ",
           ""  => " ",
           "'" => " " }

def encode(text)
  # TODO: write a method which returns the morse sentence for the given text
  # NOTE: you may want to extract a `encode_word` method
  encode_word = ""
  text.chars.each { |element| encode_word << element.gsub(/(\w|\W)/, MASTER) }
  encode_word
end
ztigrdn8

ztigrdn81#

密码
首先,让我们使用word.chars.map { |letter| MASTER[letter] }从哈希中获得哈希等价值,然后使用正则表达式/(?<=\w) (?=\w)/替换空白空间。

def encode(text)
  text.gsub(/\w+/) do |word|
    word.chars.map { |letter| MASTER[letter] }.join("").gsub(/(?<=\w) (?=\w)/, "")
  end
end

示例输入

text = "hello world"
p encode(text)

输出

"......-...-..--- .-----.-..-..-.."
cidc1ykv

cidc1ykv2#

将文本按空格(或者任何空格)拆分为单词,使用莫尔斯电码替换表翻译单词中的每个字符,然后将所有内容重新连接在一起(用空格连接字符,用管道连接单词)。

def encode(text)
  text.split(" ").map do |word|
    word.each_char.map do |char|
      MASTER[char]
    end.join(" ")
  end.join("|")
end

注意

  • 这将开始失败,只要你有输入,是不包含在你的莫尔斯表. E.g.一个é将导致一个错误.
  • 由于莫尔斯电码中的大写/小写字母是相同的,因此您可以删除一半的表格,并确保使用正确的大小写进行查找。
uplii1fm

uplii1fm3#

假设master是问题中给出的哈希值。
假设

text = "Little Miss Muffet"

我们可以如下修改text

text.gsub(/.(?=(.))?/) do |c|
  MASTER[c] + ((c != ' ' && $1 && $1 != ' ') ? ' ' : '')
end
  #=> ".-.. .. - - .-.. .|-- .. ... ...|-- ..- ..-. ..-. . -"

请参见字符串#gsub。
正则表达式具有以下元素。

.       # match any character (other than a line terminator)
(?=     # begin a positive lookahead
  (.)   # match any character and save it to capture group 1
)?      # end the positive lookahead and make it optional

如果匹配的第一个字符后面跟着另一个字符,则将执行正向前查找,并且将随后的字符保存到捕获组1并由全局变量$1保存。
如果匹配的第一个字符是字符串中的最后一个字符,则不会执行向前查找。在这种情况下,$1 #=> nil
表达

c != ' ' && $1 && $1 != ' '

读取“匹配的字符('c')既不是空格,也不是字符串的最后一个字符($1),并且后面的字符不是空格($1 != ' ')"。
请注意,这种方法直接操作字符串,而不是将其分解为单词,将每个单词转换为字母数组,操作这些数组,然后将结果转换回字符串。

相关问题