将长单词分成等长的单词

时间:2013-09-23 23:56:39

标签: javascript string split

如何使用JavaScript分割极长的单词?我不是在寻找像word-break: break-all这样的CSS解决方案。目标是在长字中插入空格以将它们分成更小的部分。解决方案应该尽可能快,因为它会在几秒钟内被调用数千次。

示例解决方案应如何工作:

splitString("This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxample string.");
=> This is an exxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxample string.

splitString("AnotherExammmmmmmmmmmpleeeeeeeeeeeeeeeee");
=> AnotherExammmmmm mmmmmpleeeeeee eeeeeeeeee

任何太长的单词都会用空格字符分隔。

如果得到的碎片长度大致相等,那就更好了。

3 个答案:

答案 0 :(得分:2)

由于您要求提高效果,我比较了正则表达式方法:

function splitString(str, length) {
  var regex = new RegExp("/(\w{" + length + "})(?=\w)/g");
  return str.replace(regex, "$1 ");
}

使用这个相对简单的手工制作解决方案:

function splitString(str, length) {
    var words = str.split(" ");
    for (var j = 0; j < words.length; j++) {
        var l = words[j].length;
        if (l > length) {
            var result = [], i = 0;
            while (i < l) {
                result.push(words[j].substr(i, length))
                i += length;
            }
            words[j] = result.join(" ");
        }
    }
    return words.join(" ");
}

JsPerf说我的机器上的正则表达式版本大约快了8%(Mac Opera16)。由于这也更简洁,我会去做。

答案 1 :(得分:1)

虽然这对确保片段长度相等没有任何作用,但它会确保字符串中的单词不超过40个字符。

'This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxample string.'
    .replace(/(\w{40})(?=\w)/g, '$1 ');

>> 'This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xample string.'

这里将“单词”定义为字母,数字和下划线的连续字符串。如果您希望应用“单词”的不同定义(例如,如果您的“单词”可以包含Unicode字符),则需要将\w替换为您选择的字符类。

答案 2 :(得分:0)

以下是我提出的建议:

http://jsfiddle.net/KyleMuir/czBZz/

function splitString(value) {
    var tooLongDeterminer = 12;
    var words = value.split(' ');
    for (var i = words.length - 1; i >= 0; i--) {
        if (words[i].length > tooLongDeterminer) {
            var split = words[i];
            var tempArray = new Array();
            while (split != '') {
                var word = splitWord(split, tooLongDeterminer);
                tempArray.push(word);
                split = split.replace(word, '');
            }

            words.splice(i, 1, tempArray.join(' '));
        }
    }
    return words.join(' ');

}

function splitWord(word, length) {
    return word.substring(0, length);
}

console.log(splitString("This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxample string."));

console.log(splitString("AnotherExammmmmmmmmmmpleeeeeeeeeeeeeeeee"));

注意:这是递归的(并且仅在chrome上测试)因此可能适合或不适合您的目的,但上述console.logs的输出如下:

AnotherExamm mmmmmmmmmple eeeeeeeeeeee eeee

This is an exxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxample string.

希望这有助于并感谢挑战:)