假设有一个这样的字符串:
var content = "1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20";
我想在每5个点后添加<br />
。
所以,结果应该是:
1.2.3.4.5.<br />
6.7.8.9.10.<br />
11.12.13.14.15.<br />
16.17.18.19.20.<br />
我希望在没有for
循环的情况下执行此操作。只有正则表达式才有可能吗?
我正在使用此代码执行此操作;
regenerate:function(content,call){
var data2;
var brbr = content.replace(/[\u0250-\ue007]/g, '').match(/(\r\n)/g);
if (brbr !== "") {
data2 = content.replace(/[\u0250-\ue007]/g, '').replace(/(\r\n)/gm, "<br><br>");
} else {
data2 = content.replace(/[\u0250-\ue007]/g, '');
}
var dataArr = data2.split(".");
for (var y = 10; y < dataArr.length - 10; y += 10) {
var dataArrSpecific1 = dataArr[y] + ".";
var dataArrSpecific2 = dataArr[y] + ".<br>";
var dataArrSpecificBosluk = dataArr[y + 1];
var data3 = data2.replace(new RegExp(dataArrSpecific1.replace(/[\u0250-\ue007]/g, ''), "g"), "" + dataArrSpecific2.replace(/[\u0250-\ue007]/g, '') + "");
data3 = data3.replace(new RegExp(dataArrSpecificBosluk.replace(/[\u0250-\ue007]/g, ''), "g"), " " + dataArrSpecificBosluk.replace(/[\u0250-\ue007]/g, '') + "");
data2 = data3;
}
call(data2.replace(/[\u0250-\ue007]/g, ''));
}
实际上,我想重构这段代码
答案 0 :(得分:1)
工作箱:http://jsbin.com/dikifipelo/1/
var string = "1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20." ;
string = string.replace(/(([^\.]+\.){5})/g, "$1<br/>");
适用于点之间任何类型和长度的字符。
<强>解释强>:
模式/(([^.]+.){5})/g
可以分解为:
[^\.]
- 任何不是点的字符[^\.]+
- 任何不是点,一次或多次的字符[^\.]+\.
- 任何不是点,一次或多次的字符,后跟一个点([^\.]+\.){5}
- 任何字符....点,出现五次(([^\.]+\.){5})
- 任何......五次,抓住这个(所有圆括号捕获除非被告知不要,用?:作为其中的第一件事)
/g/
标志使得整个字符串匹配 - 即找到所有匹配"$1"
代表第一组(或括号)的结果
所以,replace函数在字符串中查找模式的所有实例,并用匹配本身替换它们+换行符(br
)。一旦你学会了正则表达式,生活就永远不变了。