Ruby中相同单词的两个字母之间的空格的regexp是什么?



代码执行得很好,但我缺少一个规范:同一单词的字母之间的空格必须用莫尔斯的空白空格替换。例如: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

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 != ' ')"


请注意,这种方法直接操作字符串,而不是将其分解成单词,将每个单词转换为字母数组,操作这些数组,然后将结果转换回字符串。

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

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

注意

  • 一旦输入不包含在莫尔斯表中,这将开始失败。例如,é会导致错误。
  • 由于大写/小写在莫尔斯码中是相同的,您可以删除一半的表,并确保使用正确的大小写进行查找。例如,放下小写字母,像这样查找MASTER[char.upcase]

Code

首先让我们使用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)

输出
"......-...-..--- .-----.-..-..-.."

最新更新