2015-04-13 4 views
1

Цель этого кода - написать функцию, которая увеличивает строку, чтобы создать новую строку. Если строка уже заканчивается номером, номер должен быть увеличен на 1. Если строка не заканчивается номером, номер 1 должен быть добавлен к новой строке. например «foo123» -> «foo124» или «foo» -> «foo1». С моим кодом ниже, почти все мои тестовые примеры пройдены, за исключением того, что угловой футляр для «foo999» не распечатывал «foo1000». Я знаю, что для исправления моей проблемы должен быть способ сделать регулярное выражение, но я не слишком хорошо знаком с ним. Кто-нибудь может помочь?Приращение строки: приращение последней строки одним

function incrementString (input) { 
 
    var reg = /[0-9]/; 
 
    var result = ""; 
 
    if(reg.test(input[input.length - 1]) === true){ 
 
    input = input.split(""); 
 
    for(var i = 0; i < input.length; i++){ 
 
     if(parseInt(input[i]) === NaN){ 
 
      result += input[i]; 
 
     } 
 
     else if(i === input.length - 1){ 
 
      result += (parseInt(input[i]) + 1).toString(); 
 
     } 
 
     else{ 
 
      result += input[i]; 
 
     } 
 
    } 
 
    return result; 
 
    } 
 
    else if (reg.test(input[input.length - 1]) === false){ 
 
    return input += 1; 
 
    } 
 
}

+1

ваша функция слишком сложна, вы должны использовать 'replace' метод с лямбда в качестве замены , –

ответ

0
function pad(number, length, filler) { 
    number = number + ""; 
    if (number.length < length) { 
     for (var i = number.length; i < length; i += 1) { 
      number = filler + number; 
     } 
    } 

    return number; 
} 

function incrementString (input) { 
    var orig = input.match(/\d+$/); 
    if (orig.length === 1) { 
     orig = pad(parseInt(orig[0]) + 1, orig[0].length, '0'); 
     input = input.replace(/\d+$/, orig); 
     return input; 
    } 

    return input + "1"; 
} 

Что делать?

Сначала он проверяет, есть ли завершающее число. Если да, увеличьте его и проложите его нулями (с помощью функции «pad», которую вы сами сможете отсортировать).

string.replace - это функция, которая работает с аргументом 1 подстрокой для поиска (строка, регулярное выражение), аргумент 2 - элемент для замены (строка, функция).

В этом случае я использовал регулярное выражение как первый аргумент и увеличиваемое, дополненное число.

Регулярное выражение довольно просто: \d означает «целое число» и + означает «одно или несколько предшествующих», что означает одну или несколько цифр. $ означает конец строки.

Более подробную информацию о регулярных выражениях (в JavaScript): https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp (спасибо @Casimir и др Ипполит за ссылку)

+0

Исправлено!Теперь он проверяет только на то, что последние символы являются цифрой, и в случае, если он добавляет «1» в конце строки, если он не был найден :) – Jack

+0

Омг, вы, ребята, потрясающие! Позвольте мне проверить код и вернуться к u, если у меня возникнут вопросы :) !! – Someone

+0

Код в основном передал угловой случай, за исключением того, что он не прошел этот тест: «foobar000» ---> «foobar001» – Someone

2

Вы можете использовать заменить обратный вызов:

'foo'.replace(/(\d*)$/, function($0, $1) { return $1*1+1; }); 
//=> "foo1" 
'foo999'.replace(/(\d*)$/, function($0, $1) { return $1*1+1; }); 
//=> "foo1000" 
'foo123'.replace(/(\d*)$/, function($0, $1) { return $1*1+1; }); 
//=> "foo124" 

Объяснение:

/(\d*)$/    # match 0 or more digits at the end of string 
function($0, $1) {...} # callback function with 2nd parameter as matched group #1 
return $1*1+1;   # return captured number+1. $1*1 is a trick to convert 
         # string to number 
+0

Это не принимает во внимание строки, такие как '1foo1' – Jack

+1

@Jack: Правда, но OP не упомянул о необходимости обращаться с ними. Большая проблема с этим ответом состоит в том, что он ничего не объясняет, он просто дает человеку рыбу, не обучая его рыбе. –

+0

Справедливая точка, добавленный некоторое объяснение в ответе. – anubhava

0

Я думаю, вы можете упростить ваш код значительно:

function incrementString(input) { 
    var splits = input.split(/(\d+)$/), 
    num = 1; 
    if (splits[1] !== undefined) num = parseInt(splits[1]) + 1; 
    return splits[0] + num; 
} 

Это проверяет любое количество цифр в конце строки.

+0

FYI, прошедшее время «раскола» «расщеплено», а не «расщеплено» (я бы сказал, что это неправильный глагол, но существует так много стилей глаголов на английском языке, что он может легко быть обычной формой какого-то стиля) , –

+0

Вы должны инициализировать 'num' с 1 вместо 0. –

+0

@CasimiretHippolyte: правильно, я не полностью изучил требования. @ T.J.Crowder: Спасибо за этот намек - 'splitted' не является хорошим именем переменной. 'split' не является :-) Я обновил код. – wortwart

0
function incrementString (strng) { 
     //separateing number from string 
     let x = (strng).replace(/^\D+/g, ''); 
     //getting the length of original number from the string 
     let len = x.length; 

     //getting the string part from strng 
     str = strng.split(x); 

     //incrementing number by 1 
     let number = Number(x) + 1 + ''; 

     //padding the number with 0 to make it's length exactly to orignal number 
     while(number.length < len){ 
     number = '0' + number; 
     } 

    //new string by joining string and the incremented number 
     str = (str + number).split(',').join(''); 
     //return new string 
     return str; 
    } 
Смежные вопросы