2016-07-23 2 views
4

Я хочу, чтобы изменить символ в строке со многими значениямикак заменить символ в строке с большим количеством символов

У меня есть строка, как это:

date_format = "%m/%d/%Y"; 

И я хочу, чтобы заменить когда-либо% с символ, который после того, как, так что переменная дата должна быть такой:

date_format="mm/dd/YY"; 

Вот что я пытался до сих пор, но я не могу заставить его работать, так что мне нужна помощь здесь:

function replaceon(str, index, chr) { 
    if (index > str.length - 1) return str; 
    return str.substr(0, index) + chr + str.substr(index + 1); 
} 

function locations(substring, string) { 
    var a = [], 
     i = -1; 
    while ((i = string.indexOf(substring, i + 1)) >= 0) a.push(i); 
    return a; 
} 

function corrent_format(date_format) { 
    var my_locations = locations('%', date_format); 
    console.log(my_locations.length); 
    for (var i = 0; i < my_locations.length; i++) { 
     replaceon(date_format, my_locations[i], date_format[my_locations[i] + 1]); 
    } 
    return date_format; 
} 

console.log(corrent_format(date_format)); 

ответ

3

Вы можете использовать регулярное выражение для этого:

var date_format="%m/%d/%Y"; 
 
var res = date_format.replace(/%(.)/g, "$1$1"); 
 

 
console.log(res);

+0

она работала отлично :) спасибо –

1

function act(str) { 
 
    var res = ""; 
 
    for (var i = 0; i < (str.length - 1); i++) { 
 
    if (str[i] === "%") 
 
     res += str[i + 1]; 
 
    else 
 
     res += str[i]; 
 
    } 
 
    res += str[i]; 
 
    return res; 
 
} 
 
var date_format = "%m/%d/%Y"; 
 
console.log(act(date_format));

+0

она работала отлично :) спасибо –

4

Вы можете попробовать это:

"%m/%d/%Y".replace(/%([^%])/g,"$1$1") 

Надеюсь, что это hepls.

+0

она работала отлично :) спасибо –

1

Ваш код не работает, потому что переменная date_format не изменяется функцией corrent_format. Функция replaceon возвращает новую строку. Если присвоить результат date_format, вы должны получить ожидаемый результат:

for (var i = 0; i < my_locations.length; i++) { 
    date_format = replaceon(date_format, my_locations[i], date_format[my_locations[i]+1]) 
} 

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

date_format.replace(/%(.)/g, '$1$1'); 
+0

она работала отлично :) спасибо –

1

Для регулярных выражений оспаривается среди нас , вот перевод /%(.)/g, '$1$1':

  • / означает, что следующая часть будет регулярным выражением.
  • % найти %.
  • . любой символ, поэтому %. будет соответствовать% m,% d и/или% Y.
  • (.) Помещение в парсеры означает захват значения для использования позже.
  • /g получить все совпадения в исходной строке (а не только в первой).
  • ?1 ссылается на значение, которое мы зафиксировали ранее в (.).
  • ?1?1 повторить захваченное значение дважды.

Итак, замените каждый %. на все, что есть в ., раз два.

Теперь это выражение регулярного выражения является самым кратким и быстрым способом выполнить задание под рукой.Но, возможно, вы не можете использовать регулярные выражения. Возможно, у вас есть дислексический босс, который запретил их использование. (Dyslexia и regex - в лучшем случае непростые компаньоны.) Возможно, вы не заработали 47 часов, крича на регулярные выражения, которые не делают то, что вы хотите, что вам нужно положить, прежде чем вы сможете их использовать , Или, может быть, вы просто ненавидите регулярные выражения.

Если какой-либо из них относятся, вы также можете сделать это:

var x = '%m/%d/%y'; 
x = x.replace('%', 'm'); 
x = x.replace('%', 'd'); 
x = x.replace('%', 'y'); 
alert(x); 

Это имеет преимущество в том, что функция replace только заменяет первое совпадение.

Но серьезно, не используйте это. Используйте регулярное выражение. Всегда лучше инвестировать в это 20 часов разработки выражения регулярного выражения, которое конденсирует 20 строк кода, которые вы написали за 15 минут до одного. Если вам не придется это делать сегодня вечером, и все, что вы пытаетесь, просто не работает, и приближается к полуночи, и вы устаете ... ну, нет. Используйте регулярное выражение. В самом деле. Сопротивляйтесь соблазну, чтобы избежать поиска регулярного выражения. Вы будете рады, что вы это сделали, когда проснетесь за своим столом утром, пропустив свой срок и отправляйтесь домой и проводите больше времени с семьей, любезно предоставив вам щедрый пакет выходных пособий.

+0

Все шутки в сторону, я использую регулярное выражение, где я могу, особенно если я могу ударить что-то, что кто-то иначе уже написано. – BobRodes

Смежные вопросы