Уточнение этого регулярного выражения для захвата закрытой строки между звёздочками типа ** (str) ** - PullRequest
0 голосов
/ 07 февраля 2020

Regex101 demo

Я пытаюсь выделить строку, расположенную между **, как в **hello** до <b>hello</b>. Сначала это казалось легким, но из-за таких случаев, как ***a** и **a***, мне пришлось добавить несколько длинных паттернов. Текущее регулярное выражение таково:

\*\*((?:\*(?!\*)[^*]*)*([^*])*(?:[^*]*(?<!\*)\*)*)\*\*

Разбиение регулярного выражения

part1 (?:\*(?!\*)[^*]*)* захватывает что-то вроде *abc, у которого нет дополнительных * перед ним это означает, что он не захватит **abc. Добавлено к процессу **ab*** как <b>ab*</b>

part2 ([^*])*, фиксирует обычные символы, которые не *

part3 (?:[^*]*(?<!\*)\*)* захватывает что-то вроде abc*, которое не имеет дополнительных * после него. это означает, что он не захватит abc**. Добавлено к процессу ***ab** как <b>*ab</b>

Таблица ожидаемых результатов

**a** → <b>a</b>           : success
***a** → <b>*a</b>         : success
**a*** → <b>a*</b>         : success
**a*a** → <b>a*a</b>       : fail with the current regex
**a**a** → <b>a</b>a**     : success

Код с функцией замены

const reBoldLine = /\*\*((?:\*(?!\*)[^*]*)*([^*])*(?:[^*]*(?<!\*)\*)*)\*\*/g;
const strs = [
  '**a**',
  '***a**',     
  '**a***',     
  '***a***',
  '**a*a**'
]

const replacer = function(match, ...args){
  if(match){
    return "<b>"+args[0]+"</b>"
  }else{
    return "undefined"
  }
}

for(let str of strs){
  console.log(str.replace(reBoldLine, replacer))
}

edit: Заменено длинное объяснение с ожидаемым результатом

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