为每个已知数量的字符添加新行字符的最佳方法

时间:2014-07-29 08:14:30

标签: javascript regex string

假设我们有以下长字符串:

  

var str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dignissim viverra elementum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor at neque quis euismod. Mauris sed gravida urna. Donec tempor gravida elit, ut elementum lectus tincidunt nec. Donec arcu ligula, aliquet id eros consectetur, malesuada mollis dui. Aliquam egestas ligula non lobortis adipiscing.";

我想在每30个字符后添加新行(\n)个字符。如果第30个字符不是空格,则下一个空格将替换为新行。

str = foo(str, 30);

此次通话后,console.log(str)将输出如下内容:

//                           30
// ------------------------- |

> console.log(str);
"Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Vivamus dignissim
viverra elementum. Vestibulum ante
ipsum primis in faucibus orci
luctus et ultrices posuere cubilia
Curae; Vivamus porttitor at neque
quis euismod. Mauris sed gravida
urna. Donec tempor gravida elit,
ut elementum lectus tincidunt 
nec. Donec arcu ligula, aliquet
id eros consectetur, malesuada 
mollis dui. Aliquam egestas ligula
non lobortis adipiscing."

我知道应该可以使用一些循环,但也许可以使用一些神奇的正则表达式(RegExp + split + joinreplace ?)。

什么是最干净/最佳的方式?


我的第一个解决方法是:

var str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dignissim viverra elementum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor at neque quis euismod. Mauris sed gravida urna. Donec tempor gravida elit, ut elementum lectus tincidunt nec. Donec arcu ligula, aliquet id eros consectetur, malesuada mollis dui. Aliquam egestas ligula non lobortis adipiscing.";

const LIMIT = 30;

var newStr = "";
var last = 0;
for (var i = 0; i < str.length; i += (LIMIT - 1)) {
    var next = last + LIMIT;

    if (str[next] !== " ") {
        for (var ii = next; ii < str.length; ++ii) {
            if (str[ii] === " ") {
                next = ii;
                break;
            }
        }
    }

    newStr += str.substring(last, next).trimLeft() + "\n";
    last = next;
}

console.log(newStr);

2 个答案:

答案 0 :(得分:3)

newStr = str.match(/.{1,30}(\s|$)|\S+?(\s|$)/g).join('\n');

答案 1 :(得分:2)

你的权利,有一种奇特的方式来做到这一点。

var str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dignissim viverra elementum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor at neque quis euismod. Mauris sed gravida urna. Donec tempor gravida elit, ut elementum lectus tincidunt nec. Donec arcu ligula, aliquet id eros consectetur, malesuada mollis dui. Aliquam egestas ligula non lobortis adipiscing.";

var foo = function(str, delimiter){
       return str.match(/.{1,30}\W/g).join("\n")
}

str = foo(str, 30);
console.log(str);

EDIT从其他答案中添加了“加入”