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})*[^$]*$)