#javascript #regex
#javascript #регулярное выражение
Вопрос:
Предположим, у меня есть строка типа 'there goes "something here", and "here" and I have "nothing else to say"'
. Мне нужно регулярное выражение для точного извлечения ['something here', 'here', 'nothing else to say']
. Обратите внимание, что результаты не экранируются кавычками, это потому, что я не хочу делать второй вызов для replace(/"/g, '')
при каждом совпадении.
Для справки, это:
'there goes "something here", and "here" and I have "nothing else to say"'.match(/".*?"/g)
Дает мне это:
['"something here"', '"here"', '"nothing else to say"']
Однако, как я уже сказал, я не хочу, чтобы результаты были заключены в кавычки и выполняли replace
вызов для каждого результата.
Ответ №1:
Это должно сработать "([^"]*)"
и вот пример теста:https://regex101.com/r/CjK2fp/1
Комментарии:
1. Спасибо за ваше время, хотя ответы должны быть в JavaScript и возвращать массив.
Ответ №2:
Для случаев, когда после первой кавычки должна быть w
:
string = 'there goes "something here", and "here" and I have "nothing else to say"';
regexp = /(?<=")w.*?(?=")/g
result = string.match(regexp);
console.log(result);
Учет того, что между кавычками и содержимым должен быть интервал:
let string = 'there goes " something here ", and "here" and I have "nothing else to say"';
function everyOther(string) {
let regexp = /(?<=").*?(?=")/g
let answerArray = [];
for (; ; ) {
if (regexp.lastIndex !== 0) {
regexp.lastIndex = 2;
}
let matchArr = regexp.exec(string);
if (regexp.lastIndex === 0) {
break;
}
let match = matchArr[0]
answerArray.push(match);
}
console.log(answerArray);
}
everyOther(string);
Комментарии:
1. Эй, спасибо, что уделили мне время! Я только что обновил свой вопрос, содержащий то, что я пробовал, и это в значительной степени ваш подход 🙂
2. Хорошо, значит, вы хотите, чтобы это выглядело точно так
['something here', 'here', 'nothing else to say']
? Попробую!3. Точно. В результирующем массиве кавычек нет. Я только что заставил это работать, но решение выглядит красиво… экзотика:
Array.from('the string here'.matchAll(/"([^"] )"/g), e => e[1])
Я ищу другие решения.4. @Henri Скажи мне, все ли в порядке. Рад также объяснить
5. Это работает для данной строки, но это приведет к сбою в следующем:
'there goes " something here"'
, например.
Ответ №3:
Используя некоторые из новейших функций JS
let reg = /"(.*?)"/gi;
let results = str.matchAll(reg);
// results - is not an array, but an iterable object
// convert results to an Array
results = Array.from(results);
// using map method to get second items from each array item
// which is a captured group
results = results.map(item => item[1]);
Дополнительная информация => javascript.info ::: Сопоставлять все с группами