我有一个巨大的编码文本字符串(22000+ 个字符)。代码由数字 [0-9] 和小写字母 [az] 组成。我需要一个正则表达式在每 4 个字符后插入一个空格,并在每 40 个字符后插入一个换行符 [\n]。有任何想法吗?
2 回答
许多人更愿意使用 for 循环和字符串连接来执行此操作,但我讨厌这些substring
调用。当正则表达式不适合工作(解析 HTML)时,我真的反对使用正则表达式,但我认为在这种情况下使用起来很容易。
假设你有字符串
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(/[\n\s]/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 个字符的块,虽然我会注意到,如果你先运行 4 个字符,你将不得不运行
..................................................
或者
.... .... .... .... .... .... .... .... .... ....
考虑到您已经放入的空间。
句点可以找到任何字符,但鉴于您只使用 [0-9|az],如果您需要确保没有其他任何内容漏入,您可以使用该正则表达式代替每个句点,我只是避免让它变得更多总的。
您可能会注意到,正则表达式有一些限制。看看乔姆斯基层次结构,真正了解它们的理论局限性。