Wat betekenen ‘lui’ en ‘hebzuchtig’ in de context van reguliere expressies?

Wat zijn deze twee termen op een begrijpelijke manier?


Antwoord 1, autoriteit 100%

Greedy zal zoveel mogelijk consumeren. Van http://www.regular-expressions.info/repeat.htmlzien we de voorbeeld van het proberen om HTML-tags te matchen met <.+>. Stel dat u het volgende heeft:

<em>Hello World</em>

Je zou kunnen denken dat <.+>(.betekent elk niet-nieuwregeltekenen +betekent dat een of meer) alleen overeenkomen met de <em>en de </em>, terwijl het in werkelijkheid erg gulzig zal zijn , en ga van de eerste <naar de laatste >. Dit betekent dat het overeenkomt met <em>Hello World</em>in plaats van wat je wilde.

Door het lui te maken (<.+?>) wordt dit voorkomen. Door de ?toe te voegen na de +, zeggen we dat het zo vaak mogelijkmoet herhalen, dus de eerste >het tegenkomt, is waar we de matching willen stoppen.

Ik raad je aan om RegExrte downloaden, een geweldige tool waarmee je reguliere expressies kunt verkennen – Ik gebruik het de hele tijd.


Antwoord 2, autoriteit 47%

‘Greedy’betekent overeenkomen met de langst mogelijke reeks.

‘Lazy’betekent overeenkomen met de kortst mogelijke reeks.

Bijvoorbeeld, de hebzuchtige h.+lkomt overeen met 'hell'in 'hello'maar de luie h.+?lkomt overeen met 'hel'.


Antwoord 3, autoriteit 21%

Hebzuchtige kwantor Luie kwantor Beschrijving
* *? Star Quantifier: 0 of meer
+ +? Plus Quantifier: 1 of meer
? ?? Optionele Quantifier: 0 of 1
{n} {n}? Kwantificator: precies n
{n,} {n,}? Kwantificator: n of meer
{n,m} {n,m}? Quantifier: tussen n en m

Antwoord 4, autoriteit 8%

Gelukkig betekent dat je uitdrukking overeenkomt met een zo groot mogelijke groep, lui betekent dat deze overeenkomt met de kleinst mogelijke groep. Voor deze tekenreeks:

abcdefghijklmc

en deze uitdrukking:

a.*c

Een greedy match komt overeen met de hele string, en een luie match komt alleen overeen met de eerste abc.


Antwoord 5, autoriteit 3%

Voor zover ik weet, is de meeste regex-engine standaard hebzuchtig. Voeg een vraagteken toe aan het einde van de quantifier om luie match mogelijk te maken.

Zoals @Andre S vermeldde in de reactie.

  • Hebzuchtig: blijf zoeken totdat niet aan de voorwaarde is voldaan.
  • Lui: stop met zoeken zodra aan de voorwaarde is voldaan.

Raadpleeg het onderstaande voorbeeld voor wat hebzuchtig en wat lui is.

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
    public static void main(String args[]){
        String money = "100000000999";
        String greedyRegex = "100(0*)";
        Pattern pattern = Pattern.compile(greedyRegex);
        Matcher matcher = pattern.matcher(money);
        while(matcher.find()){
            System.out.println("I'm greeedy and I want " + matcher.group() + " dollars. This is the most I can get.");
        }
        String lazyRegex = "100(0*?)";
        pattern = Pattern.compile(lazyRegex);
        matcher = pattern.matcher(money);
        while(matcher.find()){
            System.out.println("I'm too lazy to get so much money, only " + matcher.group() + " dollars is enough for me");
        }
    }
}


Het resultaat is:

I'm greeedy and I want 100000000 dollars. This is the most I can get.
I'm too lazy to get so much money, only 100 dollars is enough for me

Antwoord 6, autoriteit 2%

Overgenomen van www.regular-expressions.info

Hebzucht: hebzuchtige kwantoren proberen het token eerst zo vaak te herhalen
mogelijk, en geeft geleidelijk wedstrijden op als de motor achteruit gaat om te vinden
een algemene wedstrijd.

Luiheid: luie kwantor herhaalt het token eerst zo vaak als nodig is, en
breidt de match geleidelijk uit terwijl de engine door de regex terugkeert naar
vind een algemene match.


Antwoord 7

Van Reguliere expressie

De standaard kwantoren in regulier
uitdrukkingen zijn hebzuchtig, wat betekent dat ze
match zoveel als ze kunnen, alleen geven
terug indien nodig om overeen te komen met de
rest van de regex.

Door een luie kwantificator te gebruiken, de
expressie probeert de minimale match
eerst.


8

hebzuchtige matching. Het standaardgedrag van reguliere expressies is hebzuchtig. Dat betekent dat het probeert zoveel mogelijk te extraheren totdat het voldoet aan een patroon, zelfs wanneer een kleiner deel syntactisch voldoende zou zijn geweest.

Voorbeeld:

import re
text = "<body>Regex Greedy Matching Example </body>"
re.findall('<.*>', text)
#> ['<body>Regex Greedy Matching Example </body>']

In plaats van matchen totdat het eerste optreden van ‘& GT;’, haalde het de hele reeks. Dit is de standaard hebzucht of ‘neem het allemaal’ gedrag van regex.

luie matching , aan de andere kant, ‘duurt zo min mogelijk’. Dit kan worden bewerkstelligd door een ?aan het einde van het patroon.

Voorbeeld:

re.findall('<.*?>', text)
#> ['<body>', '</body>']

Als u wilt alleen de eerste wedstrijd die moet worden opgehaald, gebruikt u de zoekmethode in plaats daarvan.

re.search('<.*?>', text).group()
#> '<body>'

Bron: Python Regex Voorbeelden


9

het best bijvoorbeeld weergegeven. Snaar. 192.168.1.1EN EEN GREEDY RGEX \b.+\b
Misschien denk je dat dit je het 1e octet zou geven, maar komt eigenlijk overeen met de hele reeks. Waarom? Omdat de. + Hebzuchtig is en een hebzuchtige match overeenkomt met elk teken in 192.168.1.1totdat het het einde van de tekenreeks bereikt. Dit is het belangrijke bit! Nu begint het één personage per keer te maken totdat het een overeenkomst vindt voor het 3e token (\b).

Als het tekenbestand van de string een 4GB en 192.168.1.1 aan het begin was, zou u gemakkelijk kunnen zien hoe deze backtracking een probleem zou veroorzaken.

Om een ​​regex niet-hebberig (lui) te maken, zet een vraagteken na uw hebzuchtige zoektocht bij

*?
??
+?

Wat nu gebeurt, is token 2 (+?) vindt een overeenkomst, regex beweegt langs een teken en probeert vervolgens het volgende token (\b) in plaats van Token 2 (+?). Dus het kruipt door Gingerly.


10

hebzuchtige kwantificatoren zijn als de IRS / ATO

Als het daar is, nemen ze het allemaal.

De IRS komt overeen met deze regex: .*

$50,000

Dit komt overeen met alles!

Zie hier voor een voorbeeld: hebberig-voorbeeld

niet-hebzuchtige kwantiers – ze nemen zo weinig als ze kunnen

Als ik om een ​​belastingteruggave vraag, wordt de IRS plotseling niet-hebzuchtig en gebruiken ze deze kwantificator:

(.{2,5}?)([0-9]*)Tegen deze ingang: $50,000

De eerste groep is niet-behoeftig en past alleen overeen met $5– dus ik krijg een $5terugbetaling tegen de ingang van $ 50.000. Ze zijn niet-hebzuchtig. Ze nemen zo min mogelijk.

Zie hier: niet-hebberig-voorbeeld .

Waarom moeite?

Het wordt belangrijk als u bepaalde delen van een uitdrukking probeert te matchen. Soms wil je niet alles evenaren.

Hopelijk helpt dat analogie je je herinnert!


11

Probeer het volgende gedrag te begrijpen:

   var input = "0014.2";
Regex r1 = new Regex("\\d+.{0,1}\\d+");
Regex r2 = new Regex("\\d*.{0,1}\\d*");
Console.WriteLine(r1.Match(input).Value); // "0014.2"
Console.WriteLine(r2.Match(input).Value); // "0014.2"
input = " 0014.2";
Console.WriteLine(r1.Match(input).Value); // "0014.2"
Console.WriteLine(r2.Match(input).Value); // " 0014"
input = "  0014.2";
Console.WriteLine(r1.Match(input).Value); // "0014.2"
Console.WriteLine(r2.Match(input).Value); // ""

Other episodes