Impossible de répéter le motif annulé en utilisant \ @!
J'ai ce texte:
`` python x = 1 ''
Fondamentalement, des cellules python démarquées. Je voudrais extraire le contenu de la cellule entourant le curseur, le cas échéant.
Comme vous l'avez peut-être déjà deviné, j'essaie de créer un flux de travail jupyter, j'utilise jupytex et vim-slime pour la console, et je voudrais envoyer des cellules à la console.
Actuellement, j'ai du mal à faire correspondre une cellule avec regex:
/```python\(\(```\)\@!\)*```
Cela devrait correspondre à une chaîne commençant par `` `` python, puis tout sauf les guillemets triples, puis les guillemets triples, mais ce n'est pas le cas.
Curieusement, celui-ci (sans les triples guillemets de fin:
/```python\(\(```\)\@!\)*
met en évidence `` `` python, mais rien de plus.
Alors, quelle serait une expression régulière pour correspondre à une cellule python? Bonus pour une expression régulière qui correspond au contenu de la cellule sous le curseur!
Réponses
Cela devrait correspondre à une chaîne commençant par `` `` python, puis tout sauf les guillemets triples, puis les guillemets triples, mais ce n'est pas le cas.
C'est parce que le *multi ne répète aucun caractère; il répète simplement une anticipation négative, ce qui n'ajoute rien à la correspondance globale. Le moteur regex ne peut pas atteindre les triples backticks de fermeture.
/```python\(\(```\)\@!\)*```
^--------^
✘
Ajoutez un personnage à l'intérieur:
/```python\(\(```\)\@!\_.\)*```
^-^
Notez que \_.peut correspondre à n'importe quel caractère, y compris une nouvelle ligne; contrairement à .qui ne peut pas correspondre à une nouvelle ligne. Voir :h /\_.
Alors, quelle serait une expression régulière pour correspondre à une cellule python? Bonus pour une expression régulière qui correspond au contenu de la cellule sous le curseur!
Essaye ça:
```python\n\%(\%(```\)\@!\_.\)*\%#\_.\{-}\n```\n
├─┘ ├──┘
│ └ as few as possible
└ the cursor position must match here
Voir :h /\%#, et :h /\{-.
Je ne comprends pas ces expressions régulières avancées, mais celle-ci devrait faire:
^```python\_$\_.\{-}\_^```$
Pour le comprendre, laissez- :help ordinary_atomnous guider:
\_$correspond à la fin de la ligne.\_.correspond à n'importe quel caractère, y compris les fins de ligne.\_^correspond au début de la ligne.
Et avec :help non-greedy,
\{-}est identique*mais utilise l'algorithme de correspondance le plus court. N'oubliez pas que cela ne s'applique qu'à l'élément précédent,\_.dans notre cas.
Vous voudrez peut-être assouplir un peu l'expression régulière, peut-être en supprimant le ^et l' $ancrage.
Testé dans cet exemple, l'expression régulière correspond uniquement aux cellules python.
This is Python:
```python
for i in range(10):
print(i)
```
This is FORTRAN:
```fortran
DO I=1,10
WRITE(*,*)I
ENDDO
```
This is Python again
```python
for i in range(10):
print('```')
```