Javascript 向字符串中的每个空格添加空格,然后循环返回,直到满足长度要求

Javascript 向字符串中的每个空格添加空格,然后循环返回,直到满足长度要求,javascript,regex,string,Javascript,Regex,String,我有以下while循环作为我的text justify函数的一部分。我的想法是,我有文本字符串(str),需要对其进行调整(在单词之间的现有空格中添加空格),使其等于给定长度(len) 问题是,在迭代到字符串中的下一个空间并在那里添加另一个空间之前,我一次只能向现有空间添加一个空间。如果字符串中的所有空格都是这样,但它仍然不是所需的长度,我循环回到原始空格(现在是两个空格)并添加另一个空格。然后它转到单词之间的下一个空格,等等。其思想是字符串中单词之间的任何空格的差分不应超过一个空格(即Lore

我有以下while循环作为我的text justify函数的一部分。我的想法是,我有文本字符串(
str
),需要对其进行调整(在单词之间的现有空格中添加空格),使其等于给定长度(
len

问题是,在迭代到字符串中的下一个空间并在那里添加另一个空间之前,我一次只能向现有空间添加一个空间。如果字符串中的所有空格都是这样,但它仍然不是所需的长度,我循环回到原始空格(现在是两个空格)并添加另一个空格。然后它转到单词之间的下一个空格,等等。其思想是字符串中单词之间的任何空格的差分不应超过一个空格(即
Lorem--ipsum--dolor--sit
,而不是
Lorem--ipsum--dolor sit

根据我的研究,我决定对原始字符串使用
substring
方法来添加第一个额外的空间,然后我将增加索引并移动到字符串中的下一个空间,然后重复添加。这是我的密码:

var indexOf = str.indexOf(" ", 0);

if ( indexOf > -1 ) {
    while ( indexOf > -1 && str.length < len ) {
        //using a regexp to find a space before a character
        var space  = /\s(?=\b)/.exec(str);
        str = str.substring(0, indexOf + 1) + " " + str.substring(indexOf + 1);
        //go to next space in string
        indexOf = str.indexOf(space, indexOf + 2);

        if ( indexOf === -1 ) {
            //loops back to beginning of string
            indexOf = str.indexOf(space, 0);
        }

    }
}
finalResults.push(str);                           
var indexOf=str.indexOf(“,0);
如果(indexOf>-1){
while(indexOf>-1&&str.length
这段代码在大多数情况下都有效,但我注意到,在某些情况下,间隔周期是不正确的。例如,它生成以下字符串:
sit----amet,--blandit
正确的迭代何时开始
sit--amet,---blandit


如果能帮助代码在字符串中的每个空格(添加一个空格)上正确迭代一次,然后循环回到字符串的开头重新开始,直到达到所需的长度,那将是非常值得的。

我认为计算开头所需的空格数会更有效

var s=“今天是星期五”;
var总长度=40;
var标记=s.split(/\s+/);
var noSpaceLength=s.replace(/\s+/g',).length;
var minSpace=数学地板((总长度-无空间长度)/(令牌长度-1));
var剩余=(totalLength-noSpaceLength)%(tokens.length-1);
var out=令牌[0];
for(var i=1;ivar spaces=(i我认为在开始时计算所需的数字空间更有效

var s=“今天是星期五”;
var总长度=40;
var标记=s.split(/\s+/);
var noSpaceLength=s.replace(/\s+/g',).length;
var minSpace=数学地板((总长度-无空间长度)/(令牌长度-1));
var剩余=(totalLength-noSpaceLength)%(tokens.length-1);
var out=令牌[0];
for(var i=1;i
  • 将字符串(
    s
    )拆分为数组中的单词(
    a
  • 查找要在所有单词之间添加的空格数(
    add
  • 查找要在第一个单词之间添加的剩余空格(
    rem
  • 如果
    rem
    未用尽,则用
    add
    空格+一粘贴单词
代码

var s=“Caballo sin Nombre”//假设单词之间有一个空格
var len=21;//所需长度
var need=长度-s.长度;
var a=s.split(//);//split s
//需要>0和至少两个单词
如果(需要>0&&a.length>1){
var add=Math.floor(需要/(a.length-1))+1;//所有空间都需要(+现有)
var rem=need%(a.length-1);//余数
var sp=“”;
而(添加-->0)sp+='';
//替换
变量i,res='';//结果
对于(i=0;i0)res+='';//余数
}
res+=a[i];
s=res;
}
log(“““+s+”是“+s.length+”字符长”);
此解决方案

  • 将字符串(
    s
    )拆分为数组中的单词(
    a
  • 查找要在所有单词之间添加的空格数(
    add
  • 查找要在第一个单词之间添加的剩余空格(
    rem
  • 如果
    rem
    未用尽,则用
    add
    空格+一粘贴单词
代码

var s=“Caballo sin Nombre”//假设单词之间有一个空格
var len=21;//所需长度
var need=长度-s.长度;
var a=s.split(//);//split s
//需要>0和至少两个单词
如果(需要>0&&a.length>1){
var add=Math.floor(需要/(a.length-1))+1;//所有空间都需要(+现有)
var rem=need%(a.length-1);//余数
var sp=“”;
而(添加-->0)sp+='';
//替换
变量i,res='';//结果
对于(i=0;i0)res+='';//余数
}
res+=a[i];
s=res;
}
log(“““+s+”是“+s.length+”字符长”);

此函数使用全局替换添加空格,小心地限制文本大小

 function expand (txt, colwidth) {
   txt = txt.replace (/\s\s+/, ' ');        // Ensure no multiple spaces in txt

   for (var spaces = ' ',                   // Spaces to check for
            limit = colwidth - txt.length;  // number of additional spaces required
        limit > 0;                          // do while limit is positive
        spaces += ' ')                      // add 1 to spaces to search for
    txt = txt.replace (RegExp (spaces, 'g'), 
              function (r) { 
                // If limit > 0  then add a space else do not.
                return limit > 0 && --limit ? r + ' ' : r 
              });
    return txt;
 }

 for (var w = 21; w--;) console.log (expand ('this is a test.', w)); 
在控制台上显示以下内容:

    this   is  a  test.
    this  is  a  test.
    this  is  a test.
    this  is a test.
 14 this is a test.

此函数使用全局替换添加空格,小心地限制文本大小

 function expand (txt, colwidth) {
   txt = txt.replace (/\s\s+/, ' ');        // Ensure no multiple spaces in txt

   for (var spaces = ' ',                   // Spaces to check for
            limit = colwidth - txt.length;  // number of additional spaces required
        limit > 0;                          // do while limit is positive
        spaces += ' ')                      // add 1 to spaces to search for
    txt = txt.replace (RegExp (spaces, 'g'), 
              function (r) { 
                // If limit > 0  then add a space else do not.
                return limit > 0 && --limit ? r + ' ' : r 
              });
    return txt;
 }

 for (var w = 21; w--;) console.log (expand ('this is a test.', w)); 
在控制台上显示以下内容:

    this   is  a  test.
    this  is  a  test.
    this  is  a test.
    this  is a test.
 14 this is a test.

所需的空格长度是多少?每个单词之间有3个空格?所需的空格长度可能会有所不同。重要的是,最近的空格之间的差不超过1个空格。例如,如果字符串只有一个空格(字符串中有两个单词),该函数可以填充字符串,直到字符串长度到达len变量。如果字符串的起始单词之间只有一个空格,为什么不使用
replace
计算整个字符串,而不是使用循环?不,这是正确的