Группировка текста с помощью регулярного выражения

учтите, что у меня есть текст типа:

Some text 1
`special text`
Some text 2

Я могу получить «специальный текст» с помощью регулярного выражения, но мне нужны и другие части текста в виде массива, примерно так:

[
  Some text 1,
  special text,
  Some text 2
]

Я попробовал шаблон ниже, но думаю, что это не ответ

/(.*)\`(.*)\`(.*)/gm
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
81
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Мы можем попробовать использовать следующий шаблон регулярного выражения:

`.*?`|.+

В этом шаблоне указано соответствие:

  • .*? термин внутри обратных кавычек
  • | ИЛИ
  • .+ любой другой контент

Хитрость здесь заключается в том, чтобы сначала попытаться найти обратный апостроф. Только в этом случае мы потребляем остальную часть строки.

var input = `Some text 1
\`special text\`
Some text 2`;

var matches = input.match(/`.*?`|.+/g)
                   .map(x => x.replace(/^`|`$/g, ""));
console.info(matches);

спасибо, это "?" необходимо в шаблоне?

Ehsan Hatefi 12.07.2024 11:14

@EhsanHatefi Да, это действительно так, потому что предположим, что у вас в обратных кавычках более одного термина. В этом случае, если вы просто используете .*, он будет соответствовать всем условиям обратной кавычки. Нам не нужно такое поведение, мы хотим фиксировать данные до ближайшего обратного хода закрытия.

Tim Biegeleisen 12.07.2024 11:16

([^`]+): Соответствует любому тексту, который не находится в обратных кавычках.

`([^`]+)`: Сопоставляет текст в обратных кавычках.

const text =  'Some text 1 \`special text\` Some text 2';

const regex = /([^`]+)|`([^`]+)`/g;
const matches = [];
let match;

while ((match = regex.exec(text)) !== null) {
  matches.push(match[1] || match[2]);
}

console.info(matches);

Похоже, для этого вам не нужно регулярное выражение. Чтобы создать массив, split() строку с символом новой строки после удаления лишних ` символов:

const input = `Some text 1
\`special text\`
Some text 2`;

const output = input.replaceAll("`", "").split(/\n/g);
console.info(output);

Если вам нужен какой-либо текст между обратным кавычком в начале и конце строки, вы можете использовать replace с группой захвата:

^`(.*)`$

Объяснение

  • ^ Начало строки
  • `(.*)` Захватите любого персонажа между двумя обратными кавычками.
  • $ Конец строки

const str = `Some text 1
\`special text\`
Some text 2`;

const regex = /^`(.*)`$/gm;
const result = str.replace(regex, `$1`).split("\n")
console.info(result);

Чтобы не допускать никаких обратных кавычек между ними, вы можете использовать отрицательный класс символов, чтобы исключить совпадение обратных кавычек (и новой строки, если вы не хотите пересекать строки):

^`([^`\n]*)`$

const str = `Some text 1
\`special text\`
Some text 2`;

const regex = /^`([^`\n]*)`$/gm;
const result = str.replace(regex, `$1`).split("\n");
console.info(result);

Для получения нескольких совпадений в одной строке, при условии, что нет других одиночных обратных кавычек и в вашей среде поддерживается просмотр назад, вы можете сопоставить либо все символы, кроме обратной кавычки, либо сопоставить одно и то же, но затем между обратными кавычками, используя обходные пути:

[^`\n]+|(?<=`)[^`\n]*(?=`)

Объяснение

  • [^`\n]+ Соответствует 1+ символам, кроме обратного кавычка или новой строки.
  • | Или
  • (?<=`)[^`\n]*(?=`) Сопоставление необязательных символов между двумя обратными кавычками.

const str = `Some text 1
\`special text\`
Some text 2`;

const regex = /[^`\n]+|(?<=`)[^`\n]*(?=`)/g;
const result = str.match(regex)
console.info(result);

Другие вопросы по теме