Hoe kom ik overeen met "anything up until this sequence of characters" in een reguliere expressie?

Neem deze reguliere uitdrukking: /^[^abc]/. Dit komt overeen met elk teken aan het begin van een string, behalve a, b, of c.

Als u er een * achter zet - /^[^abc]*/ - zal de reguliere uitdrukking elk volgend teken blijven toevoegen aan het resultaat, totdat het een a, of b, of c tegenkomt.

Bijvoorbeeld, met de source string "qwerty qwerty whatever abc hello", zal de expressie overeenkomen met "qwerty qwerty wh".

Maar wat als ik wil dat de overeenkomende string "qwerty qwerty whatever " is?

...Met andere woorden, hoe kan ik alles laten overeenkomen tot (maar niet inclusief) de exacte reeks "abc"?

Als je alles wilt vastleggen tot en met "abc":

/^(.*?)abc/

Uitleg:

( ) legt de uitdrukking binnen de haakjes vast voor toegang met $1, $2, enz.

^ komt overeen met begin van regel

.* komt overeen met alles, ? niet-volledig (komt overeen met het minimum aantal vereiste tekens) - [1]

[1] De reden waarom dit nodig is, is dat anders, in de volgende string:

whatever whatever something abc something abc

regexes standaard greedy zijn, wat betekent dat ze zoveel mogelijk overeenkomen. Daarom zou /^.*abc/ overeenkomen met "whatever whatever something abc something ". Het toevoegen van de niet-grijze kwantor ? zorgt ervoor dat de regex alleen overeenkomt met "whatever whatever something ".

Commentaren (10)

Ik geloof dat je subexpressies nodig hebt. Als ik het me goed herinner kun je de normale () haakjes gebruiken voor subexpressies.

Dit gedeelte komt uit de grep handleiding:

 Back References and Subexpressions
       The back-reference \n, where n is a single digit, matches the substring
       previously matched  by  the  nth  parenthesized  subexpression  of  the
       regular expression.

Iets als ^[^(abc)] zou de truc moeten doen.

Commentaren (1)

De $ markeert het einde van een string, dus iets als dit zou moeten werken: [[^abc]*]$ waar je zoekt naar alles wat NIET EINDEERT in elke iteratie van abc, maar het zou aan het eind moeten zijn

Ook als je een scripttaal met regex gebruikt (zoals php of js), hebben ze een zoekfunctie die stopt wanneer het voor het eerst een patroon tegenkomt (en je kunt start vanaf links of start vanaf rechts opgeven, of met php kun je een implode doen om de string te spiegelen).

Commentaren (0)