【问题标题】:Real Time Morse code converter in JavascriptJavascript 中的实时摩尔斯电码转换器
【发布时间】:2012-04-18 16:26:41
【问题描述】:

在看到谷歌关于 gmail 莫尔斯电码的愚人节玩笑后,我想我会尝试在 javascript 中创建一个实时莫尔斯电码转换器。

我正在使用正则表达式和替换将莫尔斯电码更改为字符。例如:

.replace(/.- /g, "a").replace(/.-. /g, "r")

我遇到的问题是,当我为“r”输入.-. 时,它会给我一个“a”,因为它首先看到的是.-。 我怎样才能让它只替换完全匹配?

已更新并且正在运行!!感谢每一位帮助过我的人

http://jsfiddle.net/EnigmaMaster/sPDHL/32/ - 我的原始代码

http://jsfiddle.net/EnigmaMaster/LDKKE/6/ - 由 Shawn Chin 重写

http://jsfiddle.net/EnigmaMaster/y9A4Y/2/ - 由 Matthias Tylkowski 重写

如果有人有其他编写此程序的方法,请发帖JsFiddle

我很想看看还有什么方法可以做到这一点

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    您的问题突出了一个有趣的事实:摩尔斯电码不是prefix code。因此,您需要某种分隔符(空格、逗号等)来分隔代码符号。

    您似乎已经决定使用空格,这很好。

    话虽如此,您的正则表达式中缺少的是点符号的转义(使用/\.- / 而不是/.- /

    【讨论】:

    • 感谢您解决了部分问题
    【解决方案2】:

    另一种方法是使用二分搜索。

    二分搜索表的图形表示:用户在每个点处向左分支,在每个破折号处向右分支,直到字符完成。

    【讨论】:

      【解决方案3】:

      其他答案已经涵盖了您的示例不起作用的原因,因此我将避免重复。

      但是,我可以建议,由于您已经使用空格来分隔每个代码,一个直接的解决方案是执行一个简单的.split() 将输入文本分割成单独的单元,然后简单地做一个一对一- 一个代码到字符的映射。 这将比重复的正则表达式替换更有效,并且更不容易出错。

      例如:

      var morse = {  // use object as a map
          '.-': 'a', 
          '-...': 'b', 
          '-.-.': 'c', 
          // .... the rest ...
      };
      
      function translate_morse(code) {  // given code, return matching char
          return (typeof morse[code] === "undefined") ? "" : morse[code];
          // if the var is not found, the code is unknown/invalid. Here we 
          // simply ignore it but you could print out the code verbatim and use
          // different font styles to indicate an erroneous code
      }
      
      // example usage
      translated = code_text.split(" ").map(translate_morse).join("");
      

      这是一个工作示例:http://jsfiddle.net/KGVAm/1/

      附言我冒昧地稍微调整了代码和行为,即禁用其他字符的输入,但允许使用 backscape 进行更正。

      【讨论】:

      【解决方案4】:

      如果您一次处理一个莫尔斯字符,请从最长的序列开始,一直到较短的序列。

      【讨论】:

        【解决方案5】:

        您必须转义“。”字符:

        /\.- /
        

        而不是

        /.- /
        

        换句话说。在正则表达式中,“.”匹配任何字符。

        【讨论】:

          【解决方案6】:

          在正则表达式中,点匹配任何字符,并且您似乎在没有适当的 scape 的情况下使用它:

          /./  // this will match any character
          /\./ // this will match a dot (".") character
          

          【讨论】:

            【解决方案7】:

            您应该优先考虑您的规则并首先应用较长短语的替换:

            .replace(/\.-\./g,'r')// longer
            .replace(/\.-/g,'a')// shorter
            

            我建议你制作一个字典,按照模式长度排序,然后替换字符串:

            var str = '.-.-.';
            var dictionary = [
                ['a', '\.-'],
                ['r', '\.-\.']
                // ... and so on
            ];
            dictionary
                .sort(function(a,b){
                    return a[1] > b[1];
                })
                .forEach(function(el,i){
                     str = str.replace(new RegExp(el[1],'g'),el[0]);
                });
            

            抱歉缺少括号,我似乎在手机上找不到它们。

            update :我已经避开了正则表达式中使用的点 - 我一开始就错过了。 update2 :添加括号 :) 您可以使用字典中未转义的点并即时转义它们:

             var dictionary = [
                ['a', '.-'],
                ['r', '.-.']
            ];
            dictionary
                .sort(function(a,b){
                    return a[1] > b[1];
                })
                .forEach(function(el,i){
                     str = str.replace(new RegExp(el[1].replace(/([^\]\.)/g,'$1\.'),'g'),el[0]);
                });
            

            【讨论】:

            • 很可能我会像你建议的那样优先考虑替换,这似乎是一个更容易解决的问题,并且目前正在工作,只需要测试每个字母,看看在什么之前需要什么
            • 我真的需要每个时期都逃避还是只需要第一个时期就可以做到?
            • 不幸的是,你必须逃避每个时期,但你也可以“自动化”它
            【解决方案8】:

            我认为这里的诀窍是将某人输入的字符串拆分成块。每个“.”序列之后应该有一个空格。和 ”-”。然后您可以运行该数组并将每个条目替换为相应的字母。我会用一个开关。最后,将数组作为字符串连接在一起并显示。

            【讨论】:

            • 哎呀,我忘了在这里保存的是一个有效的废话:jsfiddle.net/vuPhp/3 不管怎样,你的新版本看起来好多了。
            • 谢谢我把你的版本也贴在了顶部
            【解决方案9】:

            对于那些正在寻找整个翻译的人:

            Here is a demo 这是整个source code

            var morseCode = {
                '.-': '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',
                '-----': '0',
                '.----': '1',
                '..---': '2',
                '...--': '3',
                '....-': '4',
                '.....': '5',
                '-....': '6',
                '--...': '7',
                '---..': '8',
                '----.': '9',
                '.--.-': 'à',
                '.--.-': 'å',
                '.-.-': 'ä',
                '----': 'ch',
                '.-..-': 'è',
                '..-..': 'é',
                '---.': 'ö',
                '..--': 'ü',
                '...--..': 'ß',
                '--.--': 'ñ',
                '.-.-.-': '.',
                '--..--': ',',
                '---...': ':',
                '-.-.-.': ';',
                '..--..': '?',
                '-....-': '-',
                '..--.-': '_',
                '-.--.': '(',
                '-.--.-': ')',
                '.----.': '\'',
                '-...-': '=',
                '.-.-.': '+',
                '-..-.': '/',
                '.--.-.': '@'
            };
            

            【讨论】:

              猜你喜欢
              • 2010-12-23
              • 2015-03-18
              • 1970-01-01
              • 1970-01-01
              • 2013-02-12
              • 2013-01-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多