Notepad ++ Ricerca di modelli complessi


3

Ciao sto cercando un pattern di regex ++ notepad ++ in un testo, e ho dei rimpiazzi. Ma finora quello che ho scoperto non sembra funzionare.

Testo di esempio:

1 blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala. 2 blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl.
3 blalblblbl: blablaa; balal blala. 4 blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl. 5 jsjjsjj; gggbqbqbq:   ghshhqhhqh !. Gsgsjjsskksk. 6 fshhhshs, nnsnnsns! nsnnsn. 7 blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm :
blslslslsavccacac,
hkkdlfmfmmf56balalala.
hdfmmfm87kdkkkkfkf.
8 blalalallajhshduie.
9 bslslslslls :
blslsllsllls,
bslslllsllsls.
nsnsnnsnsnnsnns,
hsbbbslslsllsllsls.
10 bslsllsllsllsllslls à sbsbbsbbsb , snsnnsnnsnnsn.

Ricerca modello:
Sto cercando l'inizio di qualsiasi numero seguito da uno spazio e alcuni testi e fermate prima del successivo numero preceduto da uno spazio.

il raggruppamento dovrebbe assomigliare a:

  • groupe 1: un numero
  • groupe 2: il carattere dello spazio che segue il numero
  • groupe 3: un testo che può anche includere alcuni numeri ma questi numeri non si trovano tra i caratteri dello spazio, ma sono tra (μμ).

Risultati aspettati:

<VERSETAG=1>blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala.</VERSETAG>
<VERSETAG=2> blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl.</VERSETAG>
<VERSETAG=3>blalblblbl: blablaa; balal blala.</VERSETAG>
<VERSETAG=4>blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl.</VERSETAG>
<VERSETAG=5>jsjjsjj; gggbqbqbq:   ghshhqhhqh !. Gsgsjjsskksk.</VERSETAG>
<VERSETAG=6>fshhhshs, nnsnnsns! nsnnsn.</VERSETAG>
<VERSETAG=7>blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm :
blslslslsavccacac,
hkkdlfmfmmf56balalala.
hdfmmfm87kdkkkkfkf.</VERSETAG>
<VERSETAG=8>blalalallajhshduie.</VERSETAG>
<VERSETAG=9>bslslslslls :</VERSETAG>
<VERSETAG=10>bslsllsllsllsllslls à sbsbbsbbsb , snsnnsnnsnnsn.</VERSETAG>

Testato con questo Regex grazie a @Toto (ma finora non funziona come previsto, vedi i risultati qui sotto):

Look for :
(?:^\D*|\G )(\d+)\s+(.+?)\R?(?=\s\d+\s|\z) 

replace with :
<VERSETAG=$1>$2</VERSETAG>\n

Risultato del test:

<VERSETAG=1>blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala.</VERSETAG>
 2 blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl.
<VERSETAG=3>blalblblbl: blablaa; balal blala.</VERSETAG>
<VERSETAG=4>blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl.</VERSETAG>
<VERSETAG=5>jsjjsjj; gggbqbqbq:   ghshhqhhqh !. Gsgsjjsskksk.</VERSETAG>
<VERSETAG=6>fshhhshs, nnsnnsns! nsnnsn.</VERSETAG>
 7 blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm :
blslslslsavccacac,
hkkdlfmfmmf56balalala.
hdfmmfm87kdkkkkfkf.
8 blalalallajhshduie.
9 bslslslslls :
<VERSETAG=10>bslsllsllsllsllslls à sbsbbsbbsb , snsnnsnnsnnsn.</VERSETAG>

Grazie mille in anticipo!


Potresti dirci, a parole, che cosa dovrebbe raggiungere il tuo schema?
harrymc

Ciao, come descritto nel risultato atteso: quando trova un numero che è seguito da uno spazio, dovrebbe mettere un tag lì con quel numero all'interno (& lt; VERSETAG = 1 & gt;) e prima di incontrare il numero successivo seguito da uno spazio , dovrebbe inserire il tag di chiusura. (& lt; / VERSETAG & gt;)
Pmicezjk

Ho appena eseguito il tuo nuovo test case, funziona abbastanza bene. Hai controllato . matches newline?
Toto

Sì, in effetti adesso funziona perfettamente !! Eccezionale ! Grande aiuto !
Pmicezjk

Risposte:


2

Aggiornamento in base ai commenti:

  • Ctrl + H
  • Trovare cosa: (?:^\D*|\G )(\d+)\s+(.+?)\R?(?=\s\d+\s|\z)
  • Sostituirlo con: <VERSETAG=$1>$2</VERSETAG>\n
  • check Avvolgi
  • controlla Espressione regolare
  • DAI UN'OCCHIATA . matches newline
  • Sostituisci tutto

Spiegazione:

(?:^\D*|\G )    # non capture group, beginning of line followed by 0 or more non digits  or restart from the last match position
(\d+)           # group 1, 1 or more digits
\s+             # 1 or more spaces
(.+?)           # group 2, 1 or more any character including new line, not greedy
\R?             # any kind of linebreak, optional
(?=\s\d+\s|\z)  # positive lookahead, make sure we have after 1 or more digits surround with spaces or end of file

Risultato per un esempio dato:

<VERSETAG=1>blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala.</VERSETAG>
<VERSETAG=2>blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl.</VERSETAG>
<VERSETAG=3>blalblblbl: blablaa; balal blala.</VERSETAG>
<VERSETAG=4>blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl.</VERSETAG>
<VERSETAG=5>jsjjsjj; gggbqbqbq:   ghshhqhhqh !. Gsgsjjsskksk.</VERSETAG>
<VERSETAG=6>fshhhshs, nnsnnsns! nsnnsn.</VERSETAG>
<VERSETAG=7>blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm:
blslslslsavccacac,
hkkdlfmfmmf56balalala.
hdfmmfm87kdkkkkfkf.</VERSETAG>
<VERSETAG=8>blalalallajhshduie.</VERSETAG>

Cattura schermo

enter image description here


Impressionante Toto! Siamo quasi li! ma sembra non funzionare quando la linea inizia con alcuni testi: For example, the followin is not working : 1 blablablabla. blablnsnsnns, blalblblbl: blablaa; balal blala. 2 blblb'blbµµ77777µµlblb blblb, blslsµµ105µµnlsllsl. 3 blalblblbl: blablaa; balal blala. 4 blblb'blbµµ9999µµlblb . Blblb, blslsnlsllsl. 5 jsjjsjj; gggbqbqbq: ghshhqhhqh !. Gsgsjjsskksk. 6 fshhhshs, nnsnnsns! nsnnsn. dlflflf4532llflflf, vjjsjsjss8776nndndn54; qcqaataab. 7 hhhshhshhshhshhshhs, bslslslsllslsllsll.
Pmicezjk

@Pmicezjk: basta sostituire (?:^|\G ) con (?:^\D*|\G ) all'inizio della regex. Vedi la mia modifica.
Toto

Still not working between (check around versetag 7 and 8). This is what I got when I replace (?:^|\G ) with (?:^\D*|\G ) : <VERSETAG=7>blalallallal7600hhzhz ; nmmkzjzbzbzb34fspmmm:</VERSETAG> blslslslsavccacac, hkkdlfmfmmf56balalala. hdfmmfm87kdkkkkfkf. <VERSETAG=8>blalalallajhshduie.</VERSETAG>
Pmicezjk

1
@ Pmicezjk: ho completamente riscritto la regex, non solo aggiungere \D*
Toto

1
@Pmicezjk: Scusa, non ti capisco, sembra funzionare per me. Hai controllato . matches newline? Per favore, modifica la tua domanda e aggiungi alcune linee di input che non funzionano per te.
Toto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.