Nyomkövetése reguláris kifejezések
Visszalépés történik, ha egy reguláris kifejezés minta tartalmaz változó kvantifikátorok vagy tervezési változtatásokat. és a reguláris kifejezés motor visszatér az előző mentett állapotát a keresést folytatni a mérkőzés. A nyomkövetése A szabályos kifejezés erejét. Hála neki, a kifejezés lehet erős és rugalmas, hanem egybeesik bonyolult mintákat. Másrészt, ezek a funkciók drága. Gyakran előfordul, hogy a visszalépés jelentősen csökkenti a teljesítményt a motor szabályos kifejezés. Szerencsére, a fejlesztő tudja ellenőrizni a működését a reguláris kifejezés motort és hogyan használja visszalépés. Ez a rész leírja, hogy a visszalépés, és hogyan lehet szabályozni.
Általában, ha a NFA-gép (nem determinisztikus véges automaták), mint például a processzor .NET Framework reguláris kifejezések, kialakulásáért felelős hatékony és gyors futás a reguláris kifejezések jelentése a fejlesztő.
Ez a rész a következő alfejezetekben.
Ha egy reguláris kifejezés minta nem tartalmaz kvantifikátorok vagy változó változásai a struktúrák, a reguláris kifejezés motor fut a lineáris időben. Ez azt jelenti, hogy ha a reguláris kifejezést motor egyezést talál az első nyelvi elemeken alapuló szöveg beviteli húr, összehasonlítja a következő nyelvi elemeken alapuló az alábbi szimbólum vagy csoport karaktereket a bemeneti karakterlánc. Ez addig folytatódik, amíg a keresést egy meccs nem ér véget sikeresen vagy sikertelenül. Mindkét esetben, a reguláris kifejezés motor halad feldolgozásával egy karakter karakterlánc.
A következő példa szemlélteti.
A reguláris kifejezés e \ w \ b néz ki a következő sort: kétszer fordul elő «e» betű, majd a szimbólum a szót, majd szóhatár.
Annak ellenére, hogy tartalmaz egy reguláris kifejezés kvantor. azt feldolgozzák lineáris módon. A reguláris kifejezés motor nem teljesíti visszalépés, mert a kvantor nem kvantor változók ez azt jelzi, egy adott, nem pedig egy változó előfordulások számát az előző kifejezés. Ennek eredményeként, a reguláris kifejezés keres egy meccset a sablon a bemeneti karakterlánc, amint az az alábbi táblázatban.
Pozícióját a sablon
Ha egy reguláris kifejezés minta kvantifikátorok nincsenek változók, vagy megváltoztathatja a tervek, a maximális számú összehasonlítást kell keresni a bemeneti karakterlánc megegyezik a reguláris kifejezés minta, nagyjából megegyezik a karakterek számát a karakterlánc. Ebben az esetben, a reguláris kifejezés motorja 19 összehasonlításokat, hogy meghatározza a lehetséges egyezéseket a 13 jegyű karaktersorozat. Más szóval, a reguláris kifejezés motor működik szinte lineáris időben, ha nincsenek változók vagy kvantifikátorok tervezési változtatásokat.
Ha a reguláris kifejezés magában foglalja a változó kvantifikátorok vagy módosítása tervezése, értékelése a bemeneti karakterlánc nem lehet lineáris. Ha NFA-gép sablont megfelelő a nyelvi elemeit egy reguláris kifejezés, nem karaktereket a bemeneti karakterlánc. Ezért a reguláris kifejezés motor megpróbálja megtalálni azt a teljes mérkőzés a változónak vagy alkifejezésre részkifejezésekre választás. Az átmenet a következő nyelvi elem részkifejezésekre visszaélés reguláris kifejezés motor dob vad része, és visszatér az előzőleg elmentett állapotban; ez szükséges, hogy megtalálják újra a bemeneti karakterlánc reguláris kifejezésre illeszkedő egészére. A folyamat visszatér a korábban mentett állapot egyezést nem talál a „visszalépés”.
Vegyük például egy reguláris kifejezés minta. * (Es). egybeesik a karakterek „es”, valamint az előző karaktert. Amint azt az alábbi példa, ha vesszük a bemeneti karakterlánc „Essential szolgáltatást reguláris kifejezések.” Ugyanaz, mint a sablon minden sorakoznak a betűk „es” a szó „kifejezést” befogadó.
Ebben az esetben, a reguláris kifejezés motor egy visszalépés az alábbiak szerint.
Handler egyezést talál a kifejezés. * (Ami tetszőleges számú bármilyen karakter) a teljes szöveg.
Ezután a felvezető néz ki a versenyt az „e” jel a reguláris kifejezés minta. Azonban a beírt szöveg nem több karaktert talál egyezést.
A felvezető visszatér a helyszínen az utolsó sikeres meccset „Essential szolgáltatást reguláris kifejezések”, és összehasonlítja az „e” karaktert egy ponttal a végén mondatokat. Nem véletlen.
A felvezető tartja jön vissza az előző sikeres mérkőzés lépett hátra egy karaktert, míg feltehetően alkalmas részsztring válik alsztringjeként „Essential szolgáltatást rendszeres expr”. Ezután a processzor összehasonlítja a szimbólum „e” minta a második „e” betű a szó „kifejezést”, és talál egy ilyet.
Ezután összehasonlítja az szimbólum „s” minta szimbólummal „s” után „e” karakterhez (első betű „s” a szó „kifejezést”). Sikeres mérkőzés.
Amikor egy visszalépés egyezés keresése a reguláris kifejezés minta a bemeneti karakterlánc hossza 55 karakter van szükség a 67 összehasonlító műveletek. Érdekes, ha a reguláris kifejezés minta tartalmaz egy lusta kvantor, *? (ES). egyezés keresése lesz szükség további összehasonlításokat. Ebben az esetben van szükség, hogy végre egy fordított keresést a sor elejére keresve „Es”, ahelyett, hogy a fordított keresés a sor végére, mielőtt az „r” karaktert a szó „kifejezést” reguláris kifejezés, amely megkövetelné 113 összehasonlításokat. Általános szabály, hogy ha egy reguláris kifejezés minta, van egy változó kvantor vagy változás szerkezete, az összehasonlítások száma szükséges keresni a bemeneti karakterlánc megegyezik a reguláris kifejezés minta, több mint kétszerese a karakterek számát a karakterlánc.
Az összehasonlítások száma szükséges keresni a bemeneti karakterlánc megegyezik a reguláris kifejezés minta, akkor exponenciálisan növekszik, ha a sablon tartalmaz számos változtatást vagy tervezési változtatásokat beágyazott struktúrák, vagy mi történik gyakrabban beágyazott változók kvantifikátorok. Például a reguláris kifejezés minta ^ (a +) + $ egyeznie kell a húr, amely egy vagy több karakter „a”. A példa azt mutatja, két bemeneti vonalak az azonos hosszúságú, csak az egyik, amely egybeesik a mintát. Class System.Diagnostics. Stopper meghatározásához használt végrehajtási ideje megegyezik a keresési művelet.
Mivel a kimeneti például a reguláris kifejezés motor létrehozni a hiányzó véletlen a sablont vesz kétszer annyi ideig, mint találni egy mérkőzést. Sikertelen egybeesés - a legrosszabb forgatókönyv. A reguláris kifejezés az, hogy egy reguláris kifejezés teszteli minden lehetséges módon az adatok arra következtetni, hogy nincs egyezés, és a beágyazott zárójelben nagyban növeli, hogy hány ilyen utakat. Annak megállapítására, hogy a második sor nem esik egybe a minta, a reguláris kifejezés motor, hajtsa végre a következő lépéseket:
Ez igazolja, hogy tárolja a sor elejére, majd ellenőrzi az első öt karakter a húr egy meccset sablont +. Ezután ellenőrzi, hogy a sorban nincs más csoportok karakterek „a”. Ezután egy tesztet hajtunk végre, mielőtt a sor végére. Mivel a sorban egy további szimbólum ellenőrzés sikertelen. Ez a negatív eredmény esetében 9 összehasonlításokat. A reguláris kifejezés motor is tartja információt az állam, amikor véletlen "a" (1. mérkőzés), "AA" (véletlen 2), "AAA" (véletlen 3) és a "aaaa" (Match 4).
Ezután visszatér az előzőleg tárolt véletlenül 4. Ezután a jelen kiegészítő jel „a”, amely hozzá van rendelve további elfogott csoport. Ezután egy tesztet hajtunk végre, mielőtt a sor végére. Mivel a sorban egy további szimbólum ellenőrzés sikertelen. Ez a negatív eredmény esetében négy összehasonlításban. Így összesen 13 összehasonlításokat végezni.
Aztán visszatér a korábban elmentett véletlenül 3. bizonyítja az két további karakter „a” kinevezett egy további elfogott csoport. Ugyanakkor ellenőrizzük a sor végére nem megy át. A felvezető visszatér egybeesik a 3. és megpróbálja egyeztetni a további két „a” karakter, két további elfogott csoport. Ellenőrzés záróvonal nem halad. Azokat nem egyezés igényel 12 összehasonlításokat. Így összesen 25 összehasonlításokat végezni.
Összehasonlítva a bemeneti karakterlánc ellen reguláris kifejezés folytatódik ezen a módon, amíg a szabályos kifejezés nem sorolja fel az összes lehetséges kombinációját mérkőzést, megállapítva, hogy nincs egyezés. Jelenléte miatt a beágyazott kvantifikátorok ez az összehasonlítás egy olyan művelet, exponenciális komplexitás O (2 n), ahol n - a karakterek száma a bemeneti karakterlánc. Ez azt jelenti, hogy a legrosszabb esetben beviteli sor, amely 30 karakter van szükség a közelítő becslések 1073741824 összehasonlításokat, és a beolvasott sor 40 karakter - 1 099 511 627 776 összehasonlításokat. Ha ilyen sorok vagy nagyobb technikákkal működő reguláris kifejezések is végrehajthat hosszú ideig, mielőtt azt állapítja meg, hogy a bemeneti karakterlánc nem egyezik meg a reguláris kifejezés minta.
Mivel a .NET Framework 4.5, állítsa a várakozási idő értékét, amely megegyezik az érték a leghosszabb intervallum szükséges a reguláris kifejezés a keresést, hogy az első, míg nem függeszti megpróbálja megtalálni a mérkőzés, és nem okoz kivételt RegexMatchTimeoutException. Az időkorlátot, adja meg a TimeSpan értéket a kivitelező Regex. Regex (String, RegexOptions, TimeSpan) reguláris kifejezés például. Ezen kívül minden statikus módszer összehasonlítása egy sablont egy kompresszoros változat TimeSpan paramétert. amely lehetővé teszi, hogy meghatározza az időtúllépés értékét. Az alapbeállítás intervallum van megadva a Regex. InfiniteMatchTimeout és várva a reguláris kifejezés felvezető lejár.
Minden esetben ajánlott beállítani a időzítésen, ha a reguláris kifejezés visszalépés.
RegexMatchTimeoutException kifejezést jelzi, hogy a reguláris kifejezés motor nem találtunk egyezést egy meghatározott időzítés letelte után, de nem határozza meg az ok létrehozásának kivételt. Ennek oka lehet túlzott visszalépés és az elégtelen várakozási idő intervallum érték a jelenlegi rendszer betöltési idején a kivétel. Egy kivétel lehet megszakítani egy újabb keresést a bemeneti karakterlánc megegyezik, vagy növelje a időzítésen és futtassa újra a keresési művelet.
Például a következő kódot kéri a Regex kivitelező. Regex (String, RegexOptions, TimeSpan) példányosíthat Regex objektum az érték a várakozási idő egyenlő egy második. reguláris kifejezés minta (a +) + $. amely összehasonlítva a szekvenciája egy vagy több karakter „a” a sor végére utal, hogy a sablonokat túlzott használata a visszalépés. Ha létrehoz RegexMatchTimeoutException kivétel. A várakozási idő intervallum ebben a példában növeljük a maximális érték egyenlő három másodpercig. Ezután megpróbálja egyeztetni a minta megszakad.