为字符串中的每个空格添加一个空格,然后循环回来直到满足长度

时间:2016-01-30 04:35:14

标签: javascript regex string

我有以下while循环作为我的文本对齐函数的一部分。我的想法是,我需要对齐文本字符串(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);                           

此代码大部分时间都有效,但我注意到有些情况下间距的循环不正确。例如,它生成以下字符串: sit----amet,--blandit 当正确的迭代将是 sit---amet,---blandit

任何协助使这段代码在字符串中的每个空格(以添加一个空格)上正确迭代一次,然后循环回到字符串的开头以重新开始直到达到所需的长度将是非常感激的。< / p>

3 个答案:

答案 0 :(得分:1)

我认为计算开头所需的数字空间效率更高。

&#13;
&#13;
var s = "today is a friday";
var totalLength = 40;
var tokens = s.split(/\s+/);
var noSpaceLength = s.replace(/\s+/g,'').length;
var minSpace = Math.floor((totalLength - noSpaceLength)/(tokens.length-1));
var remainder = (totalLength - noSpaceLength) % (tokens.length-1);

var out = tokens[0];
for (var i = 1; i < tokens.length; i++) {
  var spaces = (i <= remainder ? minSpace+1 : minSpace);
  out += "-".repeat(spaces) + tokens[i];
}

$('#out').text(out);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="out"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

此解决方案

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

代码

var  s = "Caballo sin Nombre"; // assume one space between words
var len = 21; // desired length

var need = len - s.length;
var a = s.split(/ /); // split s

// need>0 and at least two words
if (need > 0 && a.length>1) {
     var add = Math.floor(need / (a.length-1)) + 1; // all spaces need that (+existing)
     var rem = need % (a.length-1); // remainder

     var sp = '';
     while (add-- > 0) sp += ' ';
     // replace
     var i,res = ''; // result
     for (i=0 ; i<a.length-1 ; i++) {
          res += a[i] + sp;
          if (rem-- > 0) res += ' '; // remainder
     }
     res += a[i];

     s = res;
}
console.log("'" + s + "' is " + s.length + " chars long.");

答案 2 :(得分:1)

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

 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.