在看到谷歌愚蠢的莫尔斯代码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
我很想知道如何做到这一点
答案 0 :(得分:3)
您的问题突出了一个有趣的事实:摩尔斯电码不是prefix code 。所以你需要某种分隔符空格,逗号等来分隔代码符号。
你似乎决定使用空格,这很好。
这就是说,正则表达式中缺少的是点符号的转义(使用/\.- /
代替/.- /
)
答案 1 :(得分:3)
另一种方法是使用二分法搜索。
二分搜索表的图形表示:用户在每个点处向左分支,在每个破折号处右键分支,直到角色完成。
答案 2 :(得分:1)
如果您一次处理一个莫尔斯字符,请从最长的序列开始,一直到较短的序列。
答案 3 :(得分:1)
您应该优先处理规则并首先应用替换长短语:
.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]);
});
由于缺少括号,我似乎无法在手机上找到它们。
更新:我已经逃脱了正则表达式中使用的点数 - 我首先想念它。 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]);
});
答案 4 :(得分:1)
你必须逃避“。”字符:
/\.- /
而不是
/.- /
换句话说,在正则表达式中,“。”匹配任何角色。
答案 5 :(得分:1)
在正则表达式中,点匹配任何字符,看起来你没有使用正确的scape:
/./ // this will match any character
/\./ // this will match a dot (".") character
答案 6 :(得分:1)
其他答案已经说明了你的例子没有工作的原因所以我不会重复它们。
但是,我可以建议您,因为您已经使用空格来分隔每个代码,所以直接的解决方案是使用简单的.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/
P.S。我冒昧地调整代码和行为一点,即禁用其他字符的输入,但允许backscape允许更正。
答案 7 :(得分:0)
我认为这里的技巧是将某人键入的字符串拆分为块。在“。”的每个序列之后应该有一个空格。和“ - ”。然后,您可以遍历该数组并用相应的字母替换每个条目。我会用一个开关。最后,您将数组作为字符串连接在一起并显示它。
答案 8 :(得分:0)
对于那些正在寻找整个翻译表的人:
Here is a demo,这是整个source code。
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetDesktopWindow();