I’m trying to do a customized markdown. I am also using katex with the $ ... $
group. But when replacing expressions, if they are in the $ ... $
group, I have to not replace these expressions.
EXAMPLE : Lorem **Ipsum**
(1) is *simply*
(2) dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, $ sqrt{2} **must be no bold **(3) *must be no italic *(4) $
****(5) **(6)…
- Example (1): Start with
**
and end with**
and it’s not in a$...$
group so it will be bold. - Example (2): Start with
*
and end with*
and it’s not in a$...$
group so it will be italic. - Example (3): Start with
**
and end with**
but it’s in a$...$
group so it will not be bold. - Example (4): Start with
*
and end with*
but it’s in a$...$
group so it will not be italic. - Example (5): Start with
**
and end with**
but it’s empty so it will not be bold. - Example (6): Start with
*
and end with*
but it’s empty so it will not be italic.
So, I need two regex. One of them should select those that start with **
and end with **
that cannot be empty and are not in the $ ... $
group. The other is to select the ones that start with *
and end with *
that cannot be empty and are not in the $ ... $
group.
Advertisement
Answer
To select the ones that start with
*
and end with*
that cannot be empty and are not in the$ ... $
group:
You may use this regex:
(?<!*)*[^*s]+*(?!*)(?=(?:(?:[^$]*$){2})*[^$]*$)
RegEx Details:
(?<!*)
: Negative lookbehind to fail the match if previous character is a*
*
: Match opening*
[^*s]+
: Match 1+ of any character that is not a*
and not a whitespace*
: Match closing*
(?!*)
: Negative lookahead to fail the match if next character is a*
(?=(?:(?:[^$]*$){2})*[^$]*$)
: Lookahead to assert 0 or more pair of$..$
ahead to make sure we are not matching inside$...$
If you want to match single star text inside the $...$
use:
(?<!*)*[^*s]+*(?!*)(?!(?:(?:[^$]*$){2})*[^$]*$)