Impossible de répéter le motif annulé en utilisant \ @!

Aug 21 2020

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

4 user938271 Aug 21 2020 at 03:18

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 /\{-.

4 Quasímodo Aug 21 2020 at 03:27

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('```')
```