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: Заменено длинное объяснение с ожидаемым результатом