#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,}$/, "'"));