如何生成简单的字谜保留标点符号?

时间:2016-05-13 14:01:19

标签: javascript regex

我正在为测验编写提示系统。提示是答案的字谜。为了使字谜更容易,我保持第一个和最后一个字母相同。

var _ = require('underscore');

var easy = function(s) {
    if (s.length <= 1) {
        return s;
    }
    return s[0] + _.shuffle(s.slice(1, -1)).join("") + s.slice(-1);
};

对于多个单词的答案,我想分别对每个单词进行anagram。我写道:

var peasy = function(s) {
    return s.split(/\W/).map(easy).join(" ");
}

但是这会在答案中丢失任何标点符号(用空格替换)。我想把标点符号保持在原来的位置。我怎么能这样做?

以下是三个要测试的示例:

console.log(peasy("mashed potatoes"));
console.log(peasy("computer-aided design"));
console.log(peasy("sophie's choice"));

上面的我的函数peasy未能通过第二个和第三个示例,因为它丢失了连字符和撇号。

2 个答案:

答案 0 :(得分:4)

按字分隔符拆分可以解决问题:

var peasy = function(s) {
    return s.split(/\b/).map(easy).join("");
}

说明: "computer-aided design".split(/\b/)会产生["computer", "-", "aided", " ", "design"]。然后用easy对每个元素进行随机播放并加入它们,得到类似"ctemopur-adeid diegsn"的内容......

答案 1 :(得分:2)

使用String.prototype.replace而不是拆分更简单:

  • 你不需要在第一封信之前和最后一封信之前切片。
  • 替换只发生在单词字符上(其他字符保持不变)
  • 跳过少于4个字符的单词。
  • 它更短,不需要easy功能。
var _ = require('underscore');

var peasy = function(s) {
    return s.replace(/\B\w{2,}\B/g, function (m) {
        return _.shuffle(m).join('');
    });
}