Замена подстроки в числовом формате c - PullRequest
0 голосов
/ 23 марта 2020

У меня есть строка

text *inner text 1* text2 *inner text 2*

Я должен заменить подстроки на <span></span>

Вывод

text <span>inner text 1</span> text2 <span>inner text 2</span>

Я попробовал это

replace(/[*]/g,"<span>")

Я знаю, что использование / g заменит все вхождения на <span> также я не могу заменить два параметра, поэтому вопрос в том, как заменить каждые четные вхождения на </span>

Ответы [ 4 ]

2 голосов
/ 23 марта 2020

Regex

\*([^\*]+)\*

let str = 'text *inner text 1* text2 *inner text 2*'

console.log(str.replace(/\*([^\*]+)\*/g, '<span>$1</span>'))

Демо

https://regex101.com/r/wj9WkA/1/

2 голосов
/ 23 марта 2020

Вы можете использовать счетчик и оператор остатка, передавая обратный вызов replace:

let counter = 0;
result = original.replace(/[*]/g, () => ++counter % 2 ? "<span>" : "</span>");

Live Пример:

const original = "text *inner text 1* text2 *inner text 2*";
let counter = 0;
const result = original.replace(/[*]/g, () => ++counter % 2 ? "<span>" : "</span>");
console.log(result);

Это работает, потому что 1 % 2 - это 1, что верно, но 2 % 2 - это 0, что ложно, а 3 % 2 - 1, что это правда ...

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

result = original.replace(/\*(.*?)\*/g, "<span>$1</span>");

Live Example :

const original = "text *inner text 1* text2 *inner text 2*";
let counter = 0;
const result = original.replace(/\*(.*?)\*/g, "<span>$1</span>");
console.log(result);

Предполагается, что нормально работать только на основе чередующихся * символов.

0 голосов
/ 23 марта 2020

Краткий ответ на основе { ссылка }:

var string = 'text *inner text 1* text1 *inner text 2* text2';
var newString = string.replace(/\*([\w\s]+[^*])\*/g, '<span>$1</span>');
console.log(newString);

Объяснение: Регулярное выражение ищет буквальную звездочку (\*), за которой следует группа захвата ((...)). На эту группу можно ссылаться обратно $1 во втором аргументе. В нем мы фиксируем все слова (\w) и пробелы (\s) до следующей звездочки ([^*]). Поиск применяется глобально (/g).

Второй аргумент ссылается на захваченную группу и заменяет части вокруг нее (\*).

0 голосов
/ 23 марта 2020

Вы можете использовать:

str.replace(/([*])([\w ]+)\1/g, '<span>$2</span>');

Подробности RegEx:

  • ([*]) Совпадение * и захват в группу # 1
  • ([\w ]+) Соответствие 1+ символу слова или пробела и захват в группе # 2
  • \1 используется, чтобы завершить строку тем же *, что и в группе # 1
  • Замена <span>$2</span> для переноса строки в группе № 2 в <span> и </span>

Демо:

const str = 'text *inner text 1* text2 *inner text 2*';

const res = str.replace(/([*])([\w ]+)\1/g, '<span>$2</span>');

console.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...