我有一个巨大的编码文本字符串(22000+个字符)。代码由数字 [0-9] 和小写字母 [a-z] 组成。我需要一个正则表达式在每 4 个字符后插入一个空格,需要一个正则表达式在每 40 个字符后插入一个换行符 []。有什么想法吗?
许多人更喜欢使用 for 循环和字符串连接来做到这一点,但我讨厌那些substring
调用。当正则表达式不是适合这项工作的工具(解析 HTML)时,我真的很反对使用正则表达式,但我认为在这种情况下很容易使用。
JSFiddle 示例
假设你有字符串
var str = "aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnoooo";
并且您想在每四个字符后插入一个空格,在 40 个字符后插入一个换行符,您可以使用以下代码
str.replace(/.{4}g/, function (value, index){
return value + (index % 40 == 36? 'n' : ' ');
});
请注意,如果换行符 (40) 索引不是空格索引(4) 的倍数,则此操作不起作用
我在一个项目中抽象了这个,这是一个简单的方法
/**
* Adds padding and newlines into a string without whitespace
* @param {str} str The str to be modified (any whitespace will be stripped)
* @param {int} spaceEvery number of characters before inserting a space
* @param {int} wrapeEvery number of spaces before using a newline instead
* return {string} The replaced string
*/
function addPadding(str, spaceEvery, wrapEvery) {
var regex = new RegExp(".{"+spaceEvery+"}", "g");
// Add space every {spaceEvery} chars, newline after {wrapEvery} spaces
return str.replace(/[ns]/g, '').replace(regex, function(value, index) {
// The index is the group that just finished
var newlineIndex = spaceEvery * (wrapEvery - 1);
return value + ((index % (spaceEvery * wrapEvery) === newlineIndex) ? 'n' : ' ');
});
}
好吧,正则表达式本身不会插入空格,所以我假设您有一些基于查找正则表达式的任何语言的命令
。因此,找到 4 个字符并找到 40 个字符:这在一般的正则表达式中并不漂亮(除非您的特定实现有很好的方法来表达数字)。要查找 4 个字符,请使用
....
因为典型的正则表达式查找器使用最大咀嚼,然后从一个正则表达式的末尾向前搜索并再次最大咀嚼,这会将您的字符串分成 4 个字符的部分。丑陋的部分是,在标准正则表达式中,您必须使用
........................................
找到 40 个字符的 chucks,尽管我会注意到,如果您先运行 4 个字符,则必须运行
..................................................
或
.... .... .... .... .... .... .... .... .... ....
以说明您已经放入的空间。
句点可以找到任何字符,但鉴于您只使用 [0-9|a-z],如果您需要确保没有其他内容滑入,您可以使用该正则表达式代替每个句点,我只是避免让它更加粗暴。
正如您可能注意到的,正则表达式有一些限制。看看乔姆斯基的层次结构,真正了解他们的理论局限性。