[英]regex split string at specific length and ignore incomplete word
我想在长度为30(含空格)时拆分文本。 到目前为止我的工作:
var m = "Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co";
var spacedM = m.split(' ');
var charCount = 0;
for(var i = 0; i < spacedM.length; i++){
charCount = charCount + spacedM[i].length + 0.5;
if(charCount <= 30 && $('#address1').text().length <= 30){
$('#address1').append(spacedM[i]+' ');
} else if(charCount > 30 && charCount <= 60 && $('#address2').text().length <= 30) {
$('#address2').append(spacedM[i]+' ');
} else if(charCount > 60 && charCount <= 90 && $('#address3').text().length <= 30) {
$('#address3').append(spacedM[i]+' ');
}
}
$('#address1').append($('#address1').text().length);
$('#address2').append($('#address2').text().length);
$('#address3').append($('#address3').text().length);
//output
Lorem ipsum dolor sit amet, co 31
Lorem ipsum dolor sit amet, co 31
Lorem ipsum dolor sit amet, co 31
看起来还可以。 但这也是一种骇客。 是不是? 我欢迎提出任何改进此解决方案的建议。 由于此代码将用于拆分旧数据的地址,以将其映射到地址的3个字段中。 以下是我的jsfiddle: https ://jsfiddle.net/u11p6xx4/4/
更新:我不想分裂单词。 因为如果将地址中的单词用于1个单词,则不能将其分为2部分。 因此,当chars小于30但不拆分单词时,它实际上是在拆分地址。 字符长度可以为28,然后在#address2中继续
示例地址: Blok 53-11-04 Apartment Flamingo, Keramat Jaya 2 Persiaran Gurney
预期:
Blok 53-11-04 Apartment
Flamingo, Keramat Jaya 2
Persiaran Gurney
为什么不能只使用正则表达式? 喜欢:
var m = "Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co";
var n = m.match(/.{31}/g);
$('#address1').append(n[0]);
$('#address2').append(n[1]);
$('#address3').append(n[2]);
$('#address1').append($('#address1').text().length);
$('#address2').append($('#address2').text().length);
$('#address3').append($('#address3').text().length);
// output
// Lorem ipsum dolor sit amet, co 31
// Lorem ipsum dolor sit amet, co 31
// Lorem ipsum dolor sit amet, co 31
但是,如果有第四组匹配会怎样? 您只是忽略第((31 * 3)+1)个字符中的所有内容吗?
更新 :
尝试使用此正则表达式/[^\\W].{1,30}(?:\\s|$)/g
,您仍然需要对其进行改进,但是它可以帮助您入门:
var m = "Blok 53-11-04 Apartment Flamingo, Keramat Jaya 2 Persiaran Gurney";
var n = m.match(/.{1,30}(?:\s|$)/g); // or /[^\W].{1,30}(?:\s|$)/g
$('#address1').append(n[0]);
$('#address2').append(n[1]);
$('#address3').append(n[2]);
// output
// Blok 53-11-04 Apartment
// Flamingo, Keramat Jaya 2
// Persiaran Gurney
您可以在此处过期: https ://regex101.com/r/TIRa6L/2
如果您没有更可靠的方法,请尝试所谓的“地址验证api”。 就像是:
它应该能够解析1行地址并将其转换为正确的多行格式。
像您的原始帖子一样使用For循环。 不确定您对截断的要求是什么。 此代码片段不关心截断单词。 它每30个字符分割一次。
<!-- goal is to split text when length is 30 including space -->
var m = "Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co";
var spacedM = m.split('');
var charCount = 0;
var theString = "";
var theStrings = [];
for(var b=0; b < spacedM.length; b++)
{
theString = theString + spacedM[b];
if(charCount == 29)
{
theStrings.push(theString);//add this string to the array of strings
theString = "";//reset theString
charCount = 0;//reset the charCount
}
charCount++;//increment the charCount
}
for(var i=0; i < theStrings.length ;i++)
{
console.log(theStrings[i]);
}
可以使用regexp来匹配它。 https://regex101.com/r/IszFAZ/1
它可以支持任意长度的最后一个单词。
var m = "Lorem ipsum dolor sit amet, c1 Lorem ipsum dolor sit amet, co2 Lorem ipsum dolor sit amet, coo3 Lorem ipsum dolor sit amet, c4"; console.log(m.match(/(?!\\s).{30,}?(?=\\s|$)/g));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.