1

私は次の入力を持っています:

123456_r.xyz
12345_32423_131.xyz
1235.xyz
237213_21_mmm.xyz

そして今、私は最初に接続された番号を0で始まる8つの番号に入力する必要があります:

00123456_r.xyz
00012345_32423_131.xyz
00001235.xyz
00237213_21_mmm.xyz

私の試みは、ドットを分割してから、アンダースコアで分割し(存在する場合)、最初の数字を取得してそれらを埋めることでした。

しかし、正規表現置換関数を1つの関数だけにすると、より効率的な方法があると思いますよね?これはどのように見えますか?

TIAマット

4

3 に答える 3

4

私は正規表現を使用しますが、分割のためだけです:

 var input = "12345_32423_131.xyz";
 var output = "00000000".slice(input.split(/_|\./)[0].length)+input;

結果 :"00012345_32423_131.xyz"

編集 :

私がコメントで与えた、高速で分割はないが正規表現のないソリューション:

"00000000".slice(Math.min(input.indexOf('_'), input.indexOf('.'))+1)+input
于 2013-03-12T08:35:05.710 に答える
2

置換する文字列の部分を見つけるための単純な正規表現がありますが、置換関数を使用して必要なアクションを実行する必要があります。

// The array with your strings
var strings = [
    '123456_r.xyz',
    '12345_32423_131.xyz',
    '1235.xyz',
    '237213_21_mmm.xyz'
];

// A function that takes a string and a desired length
function addLeadingZeros(string, desiredLength){
    // ...and, while the length of the string is less than desired..
    while(string.length < desiredLength){
        // ...replaces is it with '0' plus itself
        string = '0' + string;
    }

    // And returns that string
    return string;
}

// So for each items in 'strings'...
for(var i = 0; i < strings.length; ++i){
    // ...replace any instance of the regex (1 or more (+) integers (\d) at the start (^))...
    strings[i] = strings[i].replace(/^\d+/, function replace(capturedIntegers){
        // ...with the function defined above, specifying 8 as our desired length.
        return addLeadingZeros(capturedIntegers, 8);
    });
};

// Output to screen!
document.write(JSON.toString(strings));
于 2013-03-12T08:44:14.930 に答える
2

私はまったく分割しません、ただ置き換えるだけです:

"123456_r.xyz\n12345_32423_131.xyz\n1235.xyz\n237213_21_mmm.xyz".replace(/^[0-9]+/mg, function(a) {return '00000000'.slice(0, 8-a.length)+a})
于 2013-03-12T08:41:01.633 に答える