2013-11-11 2 views
0

Я пытаюсь заменить все тире в строке пробелами, если только тире не находится во фразе "not-replace". Таким образом, вся строка будет какзаменить все дефисы, но тире в фразе

var str = "change-these-dashes-but-not-replace-that"; 

, чтобы я мог закончить с `«изменить эти черточки, но не замены, что»

Но то, что я придумал не не соответствие тира это во фразе я не хочу, чтобы заменить его. Как я могу изменить это ?:

.match(/-(^not-replace)/gi); 
+0

Как насчет того, чтобы сначала заменить все дефисы, а затем заменить 'not replace' на' not-replace' – elclanrs

+0

@elclanrs: 'var str =" change-these-dashed-bot-not-replace-that not replace ";' –

ответ

2

Вот другой подход (map от ES5 может быть заменен $.map из JQuery, если используется):

str.split('not-replace').map(function(s) { 
    return s.replace(/-/g, ' '); 
}).join('not-replace'); // "change these dashes but not-replace that" 

Или даже немного короче и (потенциально) более быстрое решение:

str.replace(/-|not-replace/g, function(s) { return s === '-' ? ' ' : s; }); 

последний будет работать постоянно во всех браузерах.

+0

Вы можете смело отбросить круглые скобки: '/ - | not-replace /'. – georg

+0

@ thg435 Конечно. Я даже не знаю, почему я их добавил. Возможно, я думал о производительности, но, в конце концов, это не имеет никакого смысла, поскольку нет других матчей. Благодаря! – VisioN

+0

Мне нравится этот последний. Прохладная идея. Огромное спасибо! – 1252748

2
str.replace(/not-replace/, 'notXXXreplace').replace(/-/, ' ').replace(/notXXXreplace/, 'not-replace'); 

Т.е. сначала защитите not-replace, изменив его на что-то маловероятное, что не содержит тире. Затем замените все тире и положите обратно not-replace, где маловероятные строки.

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