REGEX - 每4个字符后插入一个空格,每40个字符后插入一个换行符

时间:2012-06-15 20:44:25

标签: regex insert

我有一个巨大的字符串(22000+个字符)的编码文本。代码由数字[0-9]和小写字母[a-z]组成。我需要一个正则表达式在每4个字符后插入一个空格,并在每个四十个字符后插入一个换行符[\ n]。有什么想法吗?

2 个答案:

答案 0 :(得分:8)

许多人更愿意使用for循环和字符串连接来执行此操作,但我讨厌那些substring调用。我真的反对使用正则表达式,因为它们不是正确的工具(解析HTML),但我认为在这种情况下使用它很容易。

JSFiddle Example

假设你有字符串

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' : ' ');
    });
}

答案 1 :(得分:2)

好吧,正则表达式本身并没有插入一个空格,所以我假设你有一些命令用你正在使用的任何语言插入基于查找正则表达式。

所以,找到4个字符并找到40个字符:这在一般的正则表达式中并不常见(除非你的特定实现有很好的表达数字的方法)。要查找4个字符,请使用

....

因为典型的正则表达式查找器使用最大的munch,然后从一个正则表达式的末尾开始向前搜索并最大程度地再次咀嚼,这将把你的字符串分成4个字符。丑陋的部分是在标准正则表达式中,你必须使用

........................................

找到40个字符的块,虽然我会注意到如果你先运行4个字符,你将不得不运行

..................................................

.... .... .... .... .... .... .... .... .... .... 

考虑您已经放入的空间。

句点找到任何字符,但鉴于您只使用[0-9 | az],如果您需要确保没有其他任何内容,您可以使用该正则表达式代替每个句点,我只是避免制作它更加严重。

正如您可能注意到的,regexp有一些限制。看看Chomsky hierarchy,真正了解他们的理论限制。