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

时间:2017-04-05 02:23:24

标签: javascript regex

我希望在长度为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个部分。因此,当字符小于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

3 个答案:

答案 0 :(得分:1)

为什么不能只使用正则表达式?像:

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

但是如果第4组匹配会发生什么?你是否忽略了((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行地址并将其转换为正确的多行格式。

答案 1 :(得分:0)

像原始帖子一样使用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]);
}

答案 2 :(得分:0)

可以使用正则表达式来匹配它。 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));