繁体   English   中英

正则表达式按特定长度拆分字符串,并忽略不完整的单词

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM