Попытка захватить вложенную строку между звездочками ** (str) ** - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь заменить **SomeStr** на <b>SomeStr</b>. Я почти достиг того, чего хочу. Основная проблема, с которой я сталкиваюсь с кодом ниже, состоит в том, что он захватывает

**def*****yo**

на 3 части **def**, *, **yo**, когда я думаю, что это должно быть **def**, ***yo**, поэтому оно будет преобразовано в <b>def</b><b>*yo</b>. Одна звездочка не должна заканчивать матч, но это то, что происходит.

const pattern = /(\*\*)([^\*\*]*)(\*\*)/g;

let str = `* abc **
* **def****yo**
*`

const replacer = function(match, first, inner, last){
  return "<b>"+inner+"</b>"
}

str = str.replace(pattern, replacer)
console.log(str)

Я буду sh Я знал, что возиться.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

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

var str = " **def*****yo**";
var regex = /\*\*([^*]*(?:\*(?!\*)[^*]*)*)\*\*/g;
var replacement = '<b>$1</b>';
console.log(str.replace(regex, replacement))

См. Демонстрационный пример regex .

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

var regex = /\*\*([^*\n]*(?:\*(?!\*)[^*\n]*)*)\*\*/g;

Детали шаблона

  • \*\* - подстрока **
  • ([^*]*(?:\*(?!\*)[^*]*)*) - Группа 1: ноль или более символов, кроме звездочек ([^*]*), за которыми следуют ноль или более последовательностей *, за которыми не следует другой *, а затем следует ноль или более символов, отличных от звездочек
  • \*\* - ** подстрока

$1 в шаблоне замены означает значение группы 1, нет необходимости использовать вызываемые элементы в аргументе замены для доступа к значениям группы.

0 голосов
/ 04 февраля 2020

В настоящее время ваше выражение Regex ищет две пары звездочек, «заключающих в скобки» группу из 0 или более элементов, отличных от звездочки (здесь у вас есть два раза, которые, как я считаю, являются избыточными в наборе, подобном этому). Это означает, что у вас никогда не будет '***' в начале соответствующей строки, потому что звездочка не может быть между двумя парами звездочек согласно вашему регулярному выражению.

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

Отчасти проблема заключается в том, что вам нужно подумать о вашей логике c немного сложнее - почему это должно быть ***yo**, когда **yo** одинаково действителен (в обоих случаях строка начинается и заканчивается двумя звездочками, а во втором случае строка фактически начинается и заканчивается ТОЛЬКО две звездочки, так что можно утверждать, что это будет даже «лучшее» совпадение). Я не уверен, что логика c, которую вы считаете нужной, это логика c, которая вам действительно нужна.

https://regexr.com/ действительно полезна для тестирования и игры с выражениями Regex. пока вы не соответствуете фразу, которую вы хотите. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *], Хотя бы на первый взгляд. (\*\*)([.\w\*]+)(\*\*)/g, кажется, работает, но вам нужно будет проверить это больше.

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