Регулярное выражение для сопоставления двух одинарных кавычек из начала и конца строк

#javascript #arrays #regex #string #ecmascript-6

#javascript #массивы #регулярное выражение #строка #ecmascript-6

Вопрос:

Мне нужно заменить две кавычки в начале и конце элементов одной кавычкой.

Мой код:

 const regex = /['']/g;
let categories = [];
let categoryArray = data.categories.split(','); // ''modiles2'', ''Men''s Apparel'', ''Women''s Apparel'', ''Jeans'', ''Sneakers''
    for (let value of Object.values(categoryArray)) {
        categories.push(categoryArray[i].replace(regex, '''));
    }
}
return categories 
// What should be 'modiles2','Men''s Apparel','Women''s Apparel','Jeans','Sneakers'
// What comes back ''modiles2'',''Men''s Apparel'',''Women''s Apparel'',''Jeans'',''Sneakers''
  

Мое регулярное выражение заменяет только первую из двух кавычек на одну кавычку.

Как мне решить эту проблему?

Комментарии:

1. const regex = /['']/g; проверьте, что такое классы символов .

2. @Rafael Если я использую » «, оно заменяет только в начале, мне нужны оба в начале и в конце, в середине мне не нужно касаться

3. Все ли элементы в массиве имеют ''' в начале и в конце? Потому что тогда вы могли бы просто нарезать каждое значение: elements.map(str => str.slice(1, -1) .

Ответ №1:

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

 const regex = /^'.*'$/g;
  

Комментарии:

1. Это заменит все двойные кавычки. Я думаю, что OP хочет это только в начале и конце.

2. Нет необходимости экранировать ' . Это не имеет особого значения в регулярных выражениях.

3. Действительно @FelixKling? Я этого не знал. Спасибо за совет!

4. Вы можете найти список здесь: developer.mozilla.org/en-US/docs/Web/JavaScript/Guide /…

Ответ №2:

Классы символов ищут любой одиночный символ между скобками. Классы символов, содержащие повторяющиеся символы, например [''] , могут обойтись без такого дублирования.

 "''modiles2'',''Men''s Apparel'',''Women''s Apparel'',''Jeans'',''Sneakers''"
    .split(',')
    .forEach(s => console.log( s.replace(/^''|''$/g, ''') ))  

Комментарии:

1. Хороший момент о классах регулярных выражений. Но вам не нужно захватывать группы для замены. В данном случае это дополнительные (мини) накладные расходы.

2. Да, это хороший момент. Я хотел использовать группы без захвата, но в итоге я их удалил. Спасибо, что указали на это.

3. @Rafael Я попытался воспроизвести это, и у меня возникла проблема: codepen.io/anon/pen/JVeMgX

4. data Строка вашего codepen разделяется , (с конечным пробелом) — split() соответственно.

Ответ №3:

Это регулярное выражение может помочь в этом. Вы могли бы рассмотреть возможность использования x27 вместо ' просто на всякий случай.

 ^(x27{2,})(. )(x27{2,})$
  

введите описание изображения здесь

Это регулярное выражение создает три группы, просто для простоты, и вы могли бы использовать $2, что является вашим целевым результатом.

Ответ №4:

Ваш шаблон использует символьный класс, [''] который соответствует любому из перечисленных, который может быть записан как ['] который просто '

Если в начале или в конце может быть больше 2, вы также можете использовать квантификатор {2,} для сопоставления 2 или более одинарных кавычек и замены на одинарную кавычку. Чтобы сопоставить ровно 2 одинарные кавычки, используйте '' .

 ^'{2,}|'{2,}$
  
  • ^'{2,} Сопоставьте 2 или более кавычек в начале строки
  • | Или
  • '{2,}$ Сопоставьте 2 или более одинарных кавычек в конце строки

Демонстрация регулярного выражения

Используйте /g глобальный флаг для замены всех вхождений.

 console.log("''modiles2'',''Men''s Apparel'',''Women''s Apparel'',''Jeans'',''Sneakers''"
.split(',')
.map(s => s.replace(/^'{2,}|'{2,}$/g, "'")))  

Ответ №5:

Вот мои два цента в одной строке:

 return data.categories.split(',').map(val => val.trim().replace(/^'{2,}|'{2,}$/, "'"));