在Javascript中对齐或填充这些字符串中的一些内容

时间:2014-04-23 17:17:21

标签: javascript regex

我有这些字符串:

14/04/14     13:31:38     12.54N     88.21W     106.8     3.8ML     Frente al Golfo de Fonseca
14/04/14     11:56:04     11.27N     86.98W     15.2     2.9ML     Frente a Masachapa
14/04/13     11:17:30     12.60N     86.80W     0.2     0.7ML     Cerca del volcan Telica

我希望将它们转换为:

14/04/14     13:31:38     12.54N     88.21W     106.8     3.8ML     Frente al Golfo de Fonseca
14/04/14     11:56:04     11.27N     86.98W      15.2     2.9ML     Frente a Masachapa
14/04/13     11:17:30     12.60N     86.80W       0.2     0.7ML     Cerca del volcan Telica

想在Javascript中使用正则表达式。

注意1 :目标是在“第五列”中对齐数据,如您所见,要对齐的模式是{的第三个外观的{1}}

注意2 :每一行都是独立的(我每个都在一个数组中)我放了超过1行来显示不同类型的场景,因为最后我需要打印出所有的行

非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以尝试每一行:

line = line.replace(/^((?:\s*\S+){4})\s+?([\s\d]{5}\.)/, "$1    $2");

方法是在以点结尾的固定长度子模式之前使用延迟量词。

注意:仅当数字有一位小数且位数在2到6之间时才有效。(从0.1到99999.9)

答案 1 :(得分:1)

如果没有单一的正则表达式,这是一个非常难的方法,它会检查每个列以检查具有最长长度的字符串,然后相应地填充。它没有以任何方式计算数字中的句点,它只是根据长度添加填充

function tabulate(arr, sep, col) {
    var cols = [];

    arr.forEach(function(str) {
        str.split(sep).forEach(function(part, i) {
            Array.isArray(cols[i]) ? cols[i].push(part) : cols[i] = [part];
        });
    });

    cols.forEach(function(arr2, i) {
        if (col.indexOf(i) != -1) {
            var padd = arr2.slice().sort(function(a,b) {
                return a.length - b.length;
            }).pop().length + 1;

            arr2.forEach(function(itm, i2) {
                cols[i][i2] = (new Array(padd - itm.length)).join(' ') + itm;
            });
        }
    });

    return arr.map(function(itm, j) {
        return cols.map(function(itm2) {
            return itm2[j];
        }).join(sep);
    });
}

用作

tabulate( array, separator string, [columns to apply function to (zero based)] )

在这种情况下等同于

tabulate(arr, '     ', [4]);

FIDDLE