Вы хотите сопоставить звезду разметки с другой звездой разметки.На вашем языке разметки буквальная звезда на самом деле не только *
, но \*
.В регулярном выражении это переводится как \\\*
: обратный слеш, который должен быть экранирован, затем звезда, который также должен быть экранирован.
Поэтому в своем шаблоне необходимо указать, что вы ищете звезда разметки , в отличие от буквальной звезды .
\*.*[^\\]\*
\* a markup star
.* followed by any character
[^\\]\* then a markup star, that is, one not escaped by a backslash
Это немного не так, потому что .*
является жадным, поэтому в "*ju\*st* *ju\*st*
, он будет соответствовать всей строке, от первой до последней звезды.
Вы можете использовать ленивую / не жадную версию модификатора звезды: *?
в большинстве двигателей.Таким образом, это становится:
\*.*?[^\\]\*
\* a markup star
.*? followed by any character, but as few as possible
[^\\]\* then a markup star, that is, one not escaped by a backslash
Небольшая попытка с Python:
>>> s = r"*ju\*st* *ju\*st*"
>>> re.match(r"\*.*[^\\]\*", s)
<re.Match object; span=(0, 17), match='*ju\\*st* *ju\\*st*'>
>>> re.match(r"\*.*?[^\\]\*", s)
<re.Match object; span=(0, 8), match='*ju\\*st*'>
Если ваш движок регулярных выражений не поддерживает ленивые модификаторы, вам нужно явно указать это поведение:
\*([^*]|\\\*)*[^\\]\*
\* a markup star
( then either...
[^*] ...any character but a star...
| ...or...
\\\* ...a star prefix by a backslash, ie a literal star
)* any number
[^\\]\* then a markup star