1

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

4

2 回答 2

8

许多人更愿意使用 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(/[\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' : ' ');
    });
}
于 2013-03-01T21:40:38.960 回答
2

好吧,正则表达式本身不会插入空格,所以我假设您有一些命令,无论您使用哪种语言,都可以根据查找正则表达式插入。

因此,找到 4 个字符并找到 40 个字符:这在一般的正则表达式中并不漂亮(除非您的特定实现有很好的方法来表达数字)。要查找 4 个字符,请使用

....

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

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

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

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

或者

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

考虑到您已经放入的空间。

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

您可能会注意到,正则表达式有一些限制。看看乔姆斯基层次结构,真正了解它们的理论局限性。

于 2012-06-15T20:56:04.347 回答