Impossibile ripetere il pattern negato usando \ @!
Ho questo testo:
`` pitone x = 1 `` `
Fondamentalmente celle Python markdown. Vorrei estrarre il contenuto della cella che circonda il cursore, se presente.
Come avrai già intuito, sto cercando di creare un flusso di lavoro jupyter, utilizzo jupytex e vim-slime per la console e vorrei inviare celle alla console.
Attualmente sto lottando solo per abbinare una cella con regex:
/```python\(\(```\)\@!\)*```
Questo dovrebbe corrispondere a una stringa che inizia con `` `` python, quindi tutto tranne virgolette triple, quindi virgolette triple, ma non è così.
Stranamente, questo (senza le virgolette triple finali:
/```python\(\(```\)\@!\)*
evidenzia `` python, ma niente di più.
Quindi quale sarebbe una regex per abbinare una cella Python? Bonus per una regex che corrisponde al contenuto della cella sotto il cursore!
Risposte
Questo dovrebbe corrispondere a una stringa che inizia con `` `` python, quindi tutto tranne virgolette triple, quindi virgolette triple, ma non è così.
Questo perché il *
multi non ripete nessun carattere; ripete solo un lookahead negativo, che non aggiunge nulla alla corrispondenza complessiva. Il motore di regex non può raggiungere le triple backtick di chiusura.
/```python\(\(```\)\@!\)*```
^--------^
✘
Aggiungi un personaggio all'interno:
/```python\(\(```\)\@!\_.\)*```
^-^
Nota che \_.
può corrispondere a qualsiasi carattere, inclusa una nuova riga; contrariamente a quanto .
non può corrispondere a una nuova riga. Vedi :h /\_.
Quindi quale sarebbe una regex per abbinare una cella Python? Bonus per una regex che corrisponde al contenuto della cella sotto il cursore!
Prova questo:
```python\n\%(\%(```\)\@!\_.\)*\%#\_.\{-}\n```\n
├─┘ ├──┘
│ └ as few as possible
└ the cursor position must match here
Vedi :h /\%#, e :h /\{-.
Non capisco quelle espressioni regolari avanzate, ma questa dovrebbe fare:
^```python\_$\_.\{-}\_^```$
Per capirlo, :help ordinary_atom
guidaci:
\_$
corrisponde a fine riga.\_.
corrisponde a qualsiasi carattere, inclusa la fine delle righe.\_^
corrisponde all'inizio della riga.
E con :help non-greedy
,
\{-}
è uguale a*
ma utilizza il primo algoritmo di corrispondenza più breve. Ricorda che si applica solo all'elemento precedente,\_.
nel nostro caso.
Potresti voler rilassare un po 'la regex, magari rimuovendo ^
e $
ancorando.
Testata in questo esempio, la regex corrisponde solo alle celle 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('```')
```