2014-01-30 4 views
4

Если строка содержит одну цитату ", мне нужно заменить ее двойными кавычками "". Однако иногда действительная двойная кавычка может сопровождаться одной цитатой, например. """, которому просто нужна дополнительная цитата, добавленная в конец. Если я использую стандартную замену, например. replace('"', '""'), все кавычки превращаются в парные, конечно, не просто нечетные.Регулярное выражение для определения нечетного числа последовательных котировок

Мне нужно найти любое нечетное число последовательных котировок (в том числе по одному) и просто добавить еще одну цитату в конец. Например. " будет "", и """ будет """".

Есть ли замену регулярных выражений в JavaScript, которая может это сделать?

+0

Я придумал следующее: использование look-behind/forward, но JavaScript, похоже, не поддерживает его: '((?

+0

Это хорошая проблема с программированием, и довольно сложно получить право, поэтому +1. _However_, эта задача именно то, что можно было бы сделать, чтобы избежать двойных кавычек при написании CSV.Если это так, вы бы захотели использовать существующую библиотеку CSV, чтобы, скажем, это самостоятельно. –

+0

Правильно, JavaScript не поддерживает отрицательный lookbehind. –

ответ

6

Являются ли кавычки последовательными? Если я никогда не понял ваше требование, это будет работать ...

str = str.replace(/\"\"?/g, '""') 

Объяснение: Спички апостроф, необязательно следует другой цитате, и заменяет один/оба с двумя цитатами.

Пример:http://jsfiddle.net/aR6p2/

Или же, если это просто вопрос добавления цитаты, когда есть нечетное число кавычек в строке ...

  var count = str.split('"').length - 1 
  str = str + (count % 2 == 0 ? '' : '"') 
+0

Спасибо, это действительно решает, хотя я надеялся на одно выражение регулярного выражения , в отличие от процедурных js. –

+0

Ну, регулярное выражение, которое он использует, это «»?, а строка замены - «» –

+0

Извините, мозг шип. Первый метод подтвержден. http://regex101.com/r/zM5kL5. , так просто! –

1

Вы можете просто сделать это:

var str = '"" """" """ """""'; 
var re = /([^"]|^)"("")*(?!")/g; 
console.log(str.replace(re, '$1(quotes)')); // '"" """" (quotes) (quotes)' 

Что это делает это следующим образом:

  • он соответствует не-котировка - или начало введенной строки - первая, и сохраняет его в первой группе захвата
  • , то он совпадает с одним двойными кавычками
  • затем группа из 2-й двойных кавычек, любое количество раз (0 или более)
  • Затем он проверяет, является ли следующий символ некакой, но фактически не соответствует ему.
  • Затем оно заменяется значением, захваченным первой группой захвата (некатримой), и строкой (quotes).

В принципе, он просто заменяет любое нечетное количество двойных котировок (quotes).

Demo

+0

Спасибо, однако я не уверен, как использовать это, чтобы добавить еще одну цитату в конец строки нечетных кавычек, которые совпадают. Если я заменю '$ 1 (кавычки)' на '$ 1 '', все, что я получаю, это одинарная цитата. –

+0

Чтобы объяснить, что я имею в виду, см .: http://regex101.com/r/rZ5zA1. У меня есть неправильная идея относительно замены? Pls см. мой комментарий по вопросу для примера того, что мне нужно (мое решение работает в php-аромате, но не js-вкус). –

+0

@ componentent_15939 Так вы хотели сделать http://regex101.com/ r/hL5aA8 или http://regex101.com/r/nQ2lH6? – Joeytje50

0

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

str = str.replace(/[^"]("+)/, function(match, group1){ 
    if((group1.length % 2) === 1 || group1.length === 1){ 
     return group1+'"'; 
    } 
    return group1; 
}); 
Смежные вопросы