Используйте Regex, чтобы изменить положение символов после преобразования Markdown. - PullRequest
0 голосов
/ 22 февраля 2020

Это кажется простым, но я не могу обернуть голову вокруг него.

При преобразовании HTML в Markdown текст с полужирным шрифтом (заключенный в двойные звездочки и сопровождаемый пробелом) может выводить неправильно, как в следующем примере:

Avoid changing existing code to match your personal preferences (see **To 'var' or Not to 'var' **below for an example). 

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

Avoid changing existing code to match your personal preferences (see **To 'var' or Not to 'var'** below for an example).

Могут быть случаи, когда строка имеет более одного слова / фразы, выделенных полужирным шрифтом, или дополнительно выделены курсивом слова (слов) / фразы (обозначены в Markdown приложением в виде одиночных звездочек). Звездочка (и) также может быть добавлена ​​к предыдущему слову, а не добавлена ​​перед следующим словом, например:

## ​Test Organization* (most of these points don't need to be followed for integration tests)*

Ближайшее, что я пришел, это:

Search: (\*\*.*?)( *\*+)
Replace: $1

Что оставляет :

see **To 'var' or Not to 'var' below

Но замена на $1** восстанавливает его первоначальную форму, и я не понимаю, почему. И я уверен, что он не принимает во внимание другие случаи использования, указанные выше.

Я не в силах исправить механизм преобразования Markdown так, чтобы эти проблемы не возникали в первую очередь.

Если у кого-то есть мысли, я был бы благодарен за них. Спасибо.

1 Ответ

1 голос
/ 22 февраля 2020

Это то, что я хотел бы сделать

^((?:[^*]|\*[^*]|\*\*(?:[^*]|\*[^*])*[^\s]\*\*)*)\*\*((?:[^*]|\*[^*])*[^\s])(\s+)\*\*

И заменяющей строкой будет $1**$2**$3, где 1 - это текст, предварительно выделенный жирным шрифтом (включая предыдущий ) рабочий жирный шрифт текст), 2 - текст, выделенный жирным шрифтом, а 3 - текст, выделяющий жирный шрифт.

enter image description here

Вот пример его правильного игнорирования жирного и итальянского c в одной строке.

**this bold is fine** and now *some italic*, but what about a lone *? **OH NO ** oh, looks like I'm fixing it

enter image description here


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

enter image description here
В основном говорится, что

  1. состоит из
    • не звездочек,
    • звездочек, которые не выделяют жирный текст, и / или
    • полужирный текст, который не заканчивается пробелами
      • полужирный текст определяется как завернутый в двойные звездочки,
      • без звездочек и / или
      • , содержащий звездочки, которые не фо помечены звездочками
  2. - жирный текст (после двойных звездочек и с использованием приведенных выше правил)
  3. - пробел в конце этого жирного текста

Обратите внимание, что большинство языков не рассматривают конец последнего совпадения / совпадения как означающий ^ в последующих совпадениях для глобальной замены
Например в 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** !

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