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

Alleen het eerste optreden in een lijn met Regex

Advertisement

komt overeen. Ik ben volledig nieuw in regex en ik zou elke hulp zeer op prijs stellen.

De taak is eenvoudig. Ik heb een CSV-bestand met records die als volgt luiden:

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

Ik wil graag de eerste komma vervangen door een spatie en de rest van de komma’s intact laten, voor elke regel. Is er een regex uitdrukking die alleen overeenkomt met de eerste komma?

Ik heb dit geprobeerd: ^.....,. Dit komt overeen met de komma, maar het komt ook overeen met de hele lengte van de string die aan de komma voorafgaat, dus als ik dit probeer te vervangen door een spatie worden alle getallen ook verwijderd.

Advertisement
Advertisement

Antwoorden (6)

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

Het bijpassende patroon zou kunnen zijn:

^([^,]+),

Dat betekent

^ 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

In b.v. perl zou de hele match en vervanging eruit zien als:

s/^([^,]+),/ /

Het vervangende deel neemt gewoon het geheel dat bij elkaar past en vervangt het door het eerste blok dat je hebt onthouden en voegt een spatie toe. De coma wordt “gedropt” omdat hij niet in de eerste vangende groep zit.

7
7
7
2012-08-01 21:31:36 +0000
s/,/ /

Dit vervangt standaard (d.w.z. zonder de g optie) alleen de eerste wedstrijd.

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

Dit moet alleen overeenkomen met het eerste getal en de komma: ^(\d{5}),. Als je al het andere in de rij wilt opslokken, verander dan de regex naar dit: ^(\d{5}),(.*)$

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

Een elegantere oplossing is het gebruik van lazy matching:

s/^(.+?),/ /

die de karakters groeperen door vanaf het begin van de string (^) naar het einde toe door één karakter (.+?) op elke stap te bewegen tot het eerste komma teken. Deze groep wordt samen met de eerste komma vervangen door een groep (“) en een spatie.

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

TextPad had altijd de mogelijkheid om de posix-notatie te gebruiken, maar je moet de instellingen in een ander dialoogvenster wijzigen. Om de standaardinstellingen van TextPad te gebruiken voor reguliere expressies, moet je de openende en sluitende haakjes “ontsnappen”:

Vervang de spatie na 5-cijferige postcode, aan het begin van elke regel

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

Met tab

\t

Zoals hierboven, betekent de ^ het begin van regel

( is een “ontsnapte haakjes” en het markeert het begin van de eerste zoekuitdrukking, d.w.z, de vijf cijfers

[0-9]+ betekent een of meer cijfers (niet alleen 5-cijferige postcodes)

) is een andere “ontsnapte haakjes” om het einde van de eerste zoekuitdrukking aan te geven

[] is slechts een spatie (je zou de haakjes kunnen weglaten, maar dan zou niemand het op deze webpagina kunnen zien: -)

In de vervangende uitdrukking

is de eerste zoekuitdrukking, het gedeelte tussen haakjes boven (een of meer cijfers)

is een tabteken

dus het commando zoeken en vervangen zoekt naar een of meer cijfers, gevolgd door een spatie. Dan vervangt het dat allemaal door dezelfde groep cijfers gevolgd door een tab.

Ik denk niet dat er een manier is om gewoon “een spatie te vinden die na 5 cijfers komt” zodat je gewoon de spatie kunt vervangen zonder de cijfers aan te raken. Je moet **de 5 cijfers (de eerste string), gevolgd door de spatie (de tweede string), vinden. Dan, hoewel het overbodig of omslachtig lijkt, REPLACE de originele string van 5 cijfers met ITSELF, gevolgd door de tab (de tweede string).

Iedereen die dit weet, vergeet dat nieuwelingen hier geen idee van hebben. Dat is de reden waarom ik het voor jou spelt, mijn vriend.

Ed Poor Math Tutor en gepensioneerde Computer Programmer New York City

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

Om alleen het eerste optreden van een regexuitdrukking te matchen, verwijder alle vlaggen. Elke regex expressie wordt geleverd met de volgende mogelijke vlaggen en standaard is het gebruik van de globale vlag die meer dan één voorkomen zal matchen:

  • /g = Met deze vlag zoekt de zoekopdracht naar alle overeenkomsten, zonder deze - alleen de eerste overeenkomst wordt geretourneerd
  • /i = geval ongevoelig
  • /m = multi line modus
  • /s = all . om te matchen met newline karakter \n
  • /u = unicode
  • /y = kleverige modus (zoek in specifieke locatie)
Advertisement

Gerelateerde vragen

3
4
12
4
5
Advertisement
Advertisement