2011-04-05 05:57:20 +0000 2011-04-05 05:57:20 +0000
45
45

Abbinando solo la prima occorrenza in una linea con Regex

sono completamente nuovo in regex e apprezzerei molto qualsiasi aiuto.

Il compito è semplice. Ho un file CSV con record che recitano così:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

Vorrei sostituire la prima virgola con uno spazio e lasciare intatto il resto delle virgole, per ogni riga. C'è un'espressione regex che corrisponda solo alla prima virgola?

Ho provato questo: ^.....,. Questa corrisponde alla virgola, tuttavia, corrisponde anche all'intera lunghezza della stringa che precede la virgola, quindi se provo a sostituire questa con uno spazio tutti i numeri vengono cancellati.

Risposte (6)

55
55
55
2011-04-05 06:26:54 +0000

Lo schema di corrispondenza potrebbe essere:

^([^,]+),
``` ```
^ starts with
[^,] anything but a comma
+ repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+) remember that part
, followed by a comma

Significa

s/^([^,]+),/ /
``` &001 


In perl, ad esempio, l'intera corrispondenza e la sostituzione sarebbe come: 


&001 &001 


Il pezzo di ricambio prende solo l'intera cosa che corrispondeva e la sostituisce con il primo blocco che si ricordava e aggiunge uno spazio. Il coma è "caduto" perché non è nel primo gruppo di cattura.
7
7
7
2012-08-01 21:31:36 +0000
s/,/ /

Questo, per impostazione predefinita (cioè senza l'opzione g), sostituisce solo la prima partita.

3
3
3
2011-04-05 06:26:08 +0000

Questo dovrebbe corrispondere solo al primo numero e alla virgola: ^(\d{5}),. Se volete ingoiare tutto il resto della riga, cambiate il regex a questo: ^(\d{5}),(.*)$

2
2
2
2015-05-13 00:44:34 +0000

La soluzione più elegante è quella di utilizzare lazy matching:

s/^(.+?),/ /

che raggrupperà i caratteri spostandosi dall'inizio della stringa (^) verso la fine di un carattere (.+?) su ogni passo fino a trovare il primo segno di virgola. Tutto questo gruppo insieme alla prima virgola che si verifica sarà sostituito da un gruppo (“) e da un carattere di spazio.

1
1
1
2015-02-28 21:07:59 +0000

TextPad ha sempre avuto la possibilità di utilizzare la notazione posix, ma è necessario modificare le impostazioni in una finestra di dialogo diversa. Per utilizzare le impostazioni predefinite di TextPad per le espressioni regolari, bisogna “sfuggire” alle parentesi di apertura e chiusura:

Sostituire lo spazio dopo il codice postale a 5 cifre, all'inizio di ogni riga

^\([0-9]+\)[]

Con tab

\t

Come sopra, la ^ significa inizio riga

( è una “parentesi sfuggita” e segna l'inizio della prima espressione di ricerca, cioè, le cinque cifre

[0-9]+ significa una o più cifre (non solo codici di avviamento postale a 5 cifre)

) è un'altra “parentesi sfuggita” che segna la fine della prima espressione di ricerca

[] è solo un carattere di spazio (si potrebbero tralasciare le parentesi, ma così nessuno potrebbe vederlo su questa pagina web : -)

Nell'espressione sostitutiva

\1 è la prima espressione di ricerca, la parte tra parentesi sopra (una o più cifre)

\t è un carattere di tabulazione

Quindi il comando di ricerca e sostituzione cerca una o più cifre, seguite da uno spazio. Poi sostituisce tutto ciò con lo stesso gruppo di cifre seguito da una tab.

Non credo che ci sia un modo semplice per trovare “uno spazio che viene dopo 5 cifre” in modo da poter sostituire lo spazio senza toccare le cifre. Bisogna trovare le 5 cifre (la prima stringa) seguite dallo spazio (la seconda stringa). Poi, anche se sembra ridondante o ingombrante, SOSTITUIRE la stringa originale di 5 cifre con ITSELF, seguita dalla scheda (la seconda stringa).

Chiunque sappia questo dimentica che i neofiti non ne hanno idea. Ecco perché lo dico per te, amico mio.

Ed Poor Math Tutor e Programmatore di computer in pensione New York City

0
0
0
2019-11-26 19:24:16 +0000

Per abbinare solo la prima occorrenza di una qualsiasi espressione regex rimuovere tutte le bandiere. Ogni espressione regex viene fornita con le seguenti possibili lanterne e tipicamente è predefinita per l'uso della lanterna globale che corrisponderà a più di una occorrenza:

  • /g = Con questa lanterna la ricerca cerca tutte le corrispondenze, senza di essa - solo la prima corrispondenza viene restituita
  • /i = insensibile alle maiuscole
  • /m = modalità multilinea
  • /s = tutte. per corrispondere al carattere newline \n
  • /u = unicode
  • /y = modalità appiccicosa (ricerca in una posizione specifica)