2016-09-20 1 views
0

В Javascript, я хочу ниже исходной строки:Javascript (Regex): Как я могу заменить пары (обратная косая черта + двойная цитата)?

Я хочу, чтобы заменить \ "это \" и \ "что \" слова, но не один "здесь"

.. чтобы стать таким, как:

Я хочу заменить^это^и ^, что^слова, но не один «здесь»

Я пытался что-нибудь г как:

var str = 'I want to replace \"this\" and \"that\" words, but NOT the one "here"'; 
str = str.replace(/\"/g,"^"); 
console.log(str); 

Demo: JSFiddle here.

Но все-таки .. выход:

Я хочу заменить^это^и ^, что^слова, но не один^здесь^

Это означает, что я хотел для замены только \" вхождений, но НЕ только ". Но я не могу.

Пожалуйста, помогите.

+2

Строка кода, которая запускает 'var str =', создает в ней строку с нулевыми обратными слэшами. В строковом литерале, если вы хотите, чтобы результирующая строка содержала обратную косую черту, вы должны ее избежать: 'var str = 'I ... \\" this \\ "и ...''. Вам также придется избегать обратной косой черты в вашем регулярном выражении. – nnnnnn

+0

^и есть, что escape-символы в строковом литерале рассматриваются как ... escape-символы -> https://jsfiddle.net/adeneo/ddst9ok2/ – adeneo

+0

Да, так .. Как я могу добиться этого в JS, пожалуйста? –

ответ

2

Как комментарий @ adeneo, ваша строка была создана неправильно и не совсем как ваше ожидание. Пожалуйста, попробуйте следующее:

var str = 'I want to replace \\"this\\" and \\"that\\" words, but not the one "here"'; 
str = str.replace(/\\\"/g,"^"); 
console.log(str); 
+1

Вам не нужно скрывать' '' в регулярном выражении. – nnnnnn

1

Вы можете использовать RegExp/(")/, String.prototype.lastIndexOf(), String.prototype.slice(), чтобы проверить, если соответствующий символ является последним или вторым в последнем матче в строке ввода. Если true, верните исходное совпадение, иначе замените совпадение с символом "^".

var str = `I want to replace \"this\" and \"that\" words, but NOT the one "here"`; 
 

 
var res = str.replace(/(")/g, function(match, _, index) { 
 
    return index === str.lastIndexOf(match) 
 
     || index === str.slice(0, str.lastIndexOf(match) -1) 
 
         .lastIndexOf(match) 
 
     ? match 
 
     : "^" 
 
}); 
 
console.log(res);

+1

Вы не правильно выражаете строку, заданную OP. Чтобы воспроизвести его как строковый литерал в JS, вам нужно было бы написать '\\' '. –

+0

это решение сложнее! Этого можно добиться проще. – Benjamin

+2

Это предполагает, что те, которые не совпадают, всегда будут в конце строки и игнорирует требование OP для соответствия обратному косую черту, за которым следует двойная кавычка (хотя OP путается о том, что это означает). – nnnnnn

0

Проблема String.prototype.replace в том, что он заменяет только первое вхождение без регулярных выражений. Чтобы это исправить, необходимо добавить g и конец RegEx, например, так:

var mod = str => str.replace(/\\\"/g,'^'); 
mod('I want to replace \\"this\\" and \\"that\\" words, but NOT the one "here"'); 

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

var mod = str => str.split('\\"').join('^'); 
mod('I want to replace \\"this\\" and \\"that\\" words, but NOT the one "here"'); 

Примечание: вы можете обернуть строку либо 'или, то есть "а, вам нужно будет положить \ в передней части„Предположим, ваша строка содержит.“ ", поскольку "a"a" вызывает синтаксическую ошибку. 'a"a' не приведет к синтаксической ошибке, так как синтаксический анализатор знает, что «является частью строки, но когда вы помещаете символ« впереди »или любые другие специальные символы, это означает, что следующий символ является специальным символом. Таким образом, 'a\"a' === 'a"a' === "a\"a". Если вы хотите сохранить \, вам нужно будет использовать \ независимо от типа цитируемой вами цитаты, поэтому для хранения \ "вам нужно будет использовать '\\"', '\\\"' или "\\\"".

+0

В чем разница между регулярным выражением между '\ '' и ' «', не убегая? –

+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –

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