Кавычки в строке с обратной косой чертой - PullRequest
1 голос
/ 12 сентября 2011

У меня есть строка: " \" ".Я хотел бы избежать всех неэкранированных двойных кавычек, т.е. добавить обратную косую черту до ", если там есть примечание.

input = '" \\" "'
input.replace(???) == '\\" \\" \\"'

Я пробовал

input.replace(/(?!\\)"/g, '\\"')

Он избегает второй обратной косой чертыдважды ('\" \\" \"') по причине, которую я не понимаю.

Я выяснил

(' ' + input).replace(/([^\\])"/g, '$1\\"').slice(1)

Но это выглядит ужасно.Это должен быть лучший способ.


Обновление:

Еще один тестовый пример:

>> input = '" \\" \\\\" \\\\\\"'
-> '" \" \\" \\\"'
>> input.replace(???)
-> '\" \" \\\" \\\"'

Ни одно из моих регулярных выраженийможет справиться с этим.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

То, что у меня есть, едва ли лучше, но оно также обрабатывает экранированные обратные слэши:

>>> var v= 'a\\"b'
>>> v
"a\"b"
>>> v.replace(/(\\*)(")/g, function(x) { var l = x.length; return (l % 2) ? x : x.substring(0,l-1) + '\\"' } )
"a\\"b"
>>> var v= 'a\\\\"b'
>>> v
"a\\"b"
>>> v.replace(/(\\*)(")/g, function(x) { var l = x.length; return (l % 2) ? x : x.substring(0,l-1) + '\\"' } )
"a\\"b"

Если перед цитатой есть нечетное количество слэшей (1, 3, 5) цитата уже экранирована;четное число (включая ноль) при необходимости убегать.

Сложнее читать из-за необходимости экранирования косых черт на входе и неспособности колоризатора понять регулярное выражениевыражение ...

Конечно, вы, вероятно, даже не должны этого делать.Если у вас есть необработанная строка, и вам нужно что-то, что вы можете передать (например) eval, рассмотрите $.toJSON.

2 голосов
/ 12 сентября 2011

Это сработало для меня:

var arf = input.replace(/(^|[^\\])"/g, '$1\\"');

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

0 голосов
/ 12 сентября 2011
String(str).replace(/[\\"']/g, "\\$&")
   .replace(/[\r\n\u2028\u2029]/g,
   function (x) {
     switch (x) {
     case '\n': return "\\n";
     case '\r': return "\\r";
     case '\u2028': return "\\u2028";
     case '\u2029': return "\\u2029";
     }
   })

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

Первая замена будет обрабатывать кавычки и обратную косую черту.Второй обрабатывает встроенные ограничители строки.

Если вы хотите иметь дело с уже заключенной в кавычки строкой, вы можете заменить первую замену на эту:

'"' + String(str).replace(/^"|"$/g, "").replace(/[\\"]/g, "\\$&") + '"'

, чтобы отменить кавычки и реквотировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...