2

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

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

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

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

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

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

4

3 回答 3

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说正则表达式版本在我的机器(Mac Opera16)上大约快 8%。因为这也更简洁,我会去的。

于 2013-09-24T00:40:21.333 回答
1

虽然这并不能确保片段长度相等,但它可以确保字符串中的单词不超过 40 个字符。

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

>> 'This is an exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xample string.'

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

于 2013-09-24T00:09:44.767 回答
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.

希望这会有所帮助并感谢您的挑战:)

于 2013-09-24T00:39:47.450 回答