Это то, что я хотел бы сделать
^((?:[^*]|\*[^*]|\*\*(?:[^*]|\*[^*])*[^\s]\*\*)*)\*\*((?:[^*]|\*[^*])*[^\s])(\s+)\*\*
И заменяющей строкой будет $1**$2**$3
, где 1
- это текст, предварительно выделенный жирным шрифтом (включая предыдущий ) рабочий жирный шрифт текст), 2
- текст, выделенный жирным шрифтом, а 3
- текст, выделяющий жирный шрифт.
Вот пример его правильного игнорирования жирного и итальянского c в одной строке.
**this bold is fine** and now *some italic*, but what about a lone *? **OH NO ** oh, looks like I'm fixing it
Если вам нужно объяснение мыслительного процесса, стоящего за ним, вставьте регулярное выражение в этот сайт, , который предоставит визуальный конечный автомат
В основном говорится, что
- состоит из
- не звездочек,
- звездочек, которые не выделяют жирный текст, и / или
- полужирный текст, который не заканчивается пробелами
- полужирный текст определяется как завернутый в двойные звездочки,
- без звездочек и / или
- , содержащий звездочки, которые не фо помечены звездочками
- - жирный текст (после двойных звездочек и с использованием приведенных выше правил)
- - пробел в конце этого жирного текста
Обратите внимание, что большинство языков не рассматривают конец последнего совпадения / совпадения как означающий ^
в последующих совпадениях для глобальной замены
Например в JS посмотрите, как второй OH NO не заменяется?
"**this bold is fine** and now *some italic*, but what about a lone *? **OH NO ** oh, looks like I'm *fixing* it **OH NO x2 **!"
.replace(/^((?:[^*]|\*[^*]|\*\*(?:[^*]|\*[^*])*[^\s]\*\*)*)\*\*((?:[^*]|\*[^*])*[^\s])(\s+)\*\*/g, '$1**$2**$3')
**this bold is fine** and now *some italic*, but what about a lone *? **OH NO** oh, looks like I'm *fixing* it **OH NO x2 **!
.
Так что будет необходим ручной цикл;
let output = '';
for (
let input ="**this bold is fine** and now *some italic*, but what about a lone *? **OH NO ** oh, looks like I'm *fixing* it **OH NO x2 **!";
output != input;
input = input.replace(/^((?:[^*]|\*[^*]|\*\*(?:[^*]|\*[^*])*[^\s]\*\*)*)\*\*((?:[^*]|\*[^*])*[^\s])(\s+)\*\*/, '$1**$2**$3')
) output = input;
console.log(output);
**this bold is fine** and now *some italic*, but what about a lone *? **OH NO** oh, looks like I'm *fixing* it **OH NO x2** !