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