A rendszeres kifejezések teljesítményének áttekintése a Java-ban

1. Áttekintés

Ebben a gyors bemutatóban megmutatjuk, hogyan működik a mintaillesztéses motor. Az optimalizálás különféle módjait is bemutatjuk reguláris kifejezések Java-ban.

Bevezetés a reguláris kifejezések, kérjük, olvassa el ezt a cikket itt.

2. A mintaillesztõ motor

A java.util.regex A csomag a mintának megfelelő motortípust használja Nemdeterminisztikus véges automatika (NFA). Fontosnak tartják nem meghatározó mert miközben megpróbálunk egy szabályos kifejezést illeszteni egy adott karaktersorozatba, a bemenet minden karakterét többször is ellenőrizhetjük a reguláris kifejezés különböző részeivel.

A háttérben a fent említett motor használ visszalépés. Ez az általános algoritmus minden lehetőséget megpróbál kimeríteni, amíg kudarcot nem nyilvánít. Fontolja meg a következő példát, hogy jobban megértse a NFA:

"tra (vel | ce | de) m"

A bemenettel Húrutazás„, A motor először keresitra”És azonnal megtalálja.

Ezután megpróbál megfelelnivel”A negyedik karaktertől kezdve. Ez meg fog egyezni, így megy előre, és megpróbáljam“.

Ez nem fog egyezni, és emiatt visszatér a negyedik karakterre, és a következőre keres:ce“. Ez megint nem fog egyezni, így visszatér a negyedik helyre, és megpróbálja a következővel:de“. Ez a karakterlánc sem fog egyezni, ezért visszatér a beviteli karakterlánc második karakteréhez, és megpróbál keresni egy másiktra“.

A legutóbbi hiba esetén az algoritmus visszaállítja a hibát.

Az egyszerű utolsó példával a motornak többször kellett visszalépnie, miközben megpróbált egyeztetni a bemenettel Húr a reguláris kifejezésre. Amiatt, fontos, hogy minimalizáljuk a visszalépés mennyiségét.

3. Az optimalizálás módjai Reguláris kifejezések

3.1. Kerülje az újrafordítást

A Java rendszeres kifejezései belső adatstruktúrává állnak össze. Ez az összeállítás időigényes folyamat.

Valahányszor a String.matches (String regex) módszerrel a megadott reguláris kifejezés újrafordításra kerül:

if (input.matches (regexPattern)) {// csináljon valamit}

Mint láthatjuk, a feltétel kiértékelésekor a regex kifejezést állítják össze.

Az optimalizálás érdekében először összeállíthatja a mintát, majd létrehozhatja a Matcher hogy megtalálja az érték egybeeséseit:

Mintaminta = Pattern.compile (regexPattern); for (String érték: értékek) {Matcher matcher = minta.matcher (érték); if (matcher.matches ()) {// csináljon valamit}}

A fenti optimalizálás alternatívája ugyanaz Matcher például annak Visszaállítás() módszer:

Mintaminta = Pattern.compile (regexPattern); Matcher matcher = minta.matcher (""); for (String érték: értékek) {matcher.reset (érték); if (matcher.matches ()) {// csináljon valamit}}

A tény miatt Matcher nem biztonságos a menet, óvatosnak kell lennünk ennek a variációnak a használatával. Többszálú esetekben valószínűleg veszélyes lehet.

Összefoglalva: minden olyan helyzetben, ahol biztosak vagyunk abban, hogy a felhasználónak csak egy felhasználója van Matcher bármely időpontban rendben van vele újrafelhasználás Visszaállítás. A többire elegendő az előre lefordított adatok újrafelhasználása.

3.2. Munka az alternációval

Amint éppen az utolsó részben ellenőriztük, a váltakozások nem megfelelő használata káros lehet a teljesítményre. Fontos, hogy olyan opciókat helyezzen el, amelyek nagyobb eséllyel történnek, hogy gyorsabban illeszthessék őket.

Ezenkívül közös mintákat kell kivonnunk közöttük. Nem ugyanaz a fogalmazás:

(utazás | kereskedelem | nyom)

Mint:

tra (vel | de | ce)

Ez utóbbi gyorsabb, mert a NFA megpróbál megfelelnitra”, És nem fogja kipróbálni egyik alternatívát sem, ha nem találja meg.

3.3. Csoportok rögzítése

Valahányszor csoportokat ragadunk meg, kis időre kiszabott büntetés jár.

Ha nem kell a szöveget rögzítenünk egy csoporton belül, akkor fontolóra kell venni a nem elfogó csoportok használatát. Helyett(M)", kérlek használd "(?: M)“.

4. Következtetés

Ebben a gyors cikkben röviden áttekintettük, hogyan NFA művek. Ezután azt kutattuk, hogyan lehet optimalizálni a reguláris kifejezéseink teljesítményét azáltal, hogy előre összeállítjuk a mintáinkat és újrafelhasználjuk a Matcher.

Végül rámutattunk néhány szempontra, amelyet szem előtt kell tartani, miközben váltakozással és csoportokkal dolgozunk.

Szokás szerint a teljes forráskód megtalálható a GitHubon.