javascript - Onko parempi käyttää metodeja RegExp-olioissa vai String-olioissa?
JavaScriptissä sekä RegExp-objekteilla että String-objekteilla on säännöllisen lausekkeen vastaavuusmenetelmiä.
RegExp-olioilla on metodit
- suorita
- testi
String-olioilla on metodit
- ottelu
- etsiä
exec- ja match-menetelmät ovat hyvin samanlaisia:
/word/.exec("words");
//Result: ["word"]
"words".match(/word/);
//Result: ["word"]
/word/.exec("No match");
//Result: null
"No match".match(/word/);
//Result: null
/word/g.exec("word word");
//Result: ["word"]
"word word".match(/word/g);
//Result: ["word", "word"]
ja testi ja haku ovat myös hyvin samanlaisia:
/word/.test("words");
//Result: true
"words".search(/word/);
//Result: 0
//Which can converted to a boolean:
"word".search(/word/) > -1;
//Result: true
/word/.test("No match");
//Result: false
"No match".search(/word/) > -1;
//Result: false
Onko mieluummin käytettävä RegExp-objektien menetelmiä vai String-objektien menetelmiä?
Vastaus #1
Lähinnä henkilökohtainen mieltymys
Tämä on enimmäkseen henkilökohtainen mieltymys, vaikka kyvykkyyksissä on pieni ero (katso viimeinen kappale siitä erosta). Ellei halua aloittaa suorituskykymittausten vertailua ja muuttaa kysymystä suorituskykyyn liittyväksi, se on enimmäkseen henkilökohtainen mieltymys.
Minä mieluummin teen:
string.match(/word/)
koska mielestäni se saa koodin lukemaan siltä, miltä aivoni ajattelevat operaatiota. Otan merkkijono-olion ja etsin siitä tiettyä säännöllistä lauseketta. Minusta on järkevää, että jonkin etsiminen merkkijonosta on metodi merkkijono-oliolle. Tämä luetaan minulle näin:
object.action(tool)
mikä mielestäni on tapa, jolla olio-ohjelmoitu koodi tulisi toimia.
Jos sinulla on:
/word/.match(string)
sitten minusta tuntuu siltä, että:
tool.action(object)
joka on mielestäni paljon vähemmän loogista ja vähemmän olioihin suuntautunutta. Kyllä, /word/ on teknisesti myös objekti, mutta se ei ole objekti, jolla yritän toimia, ajattelen sitä enemmän työkaluna tai parametrina, jota käytän objektini kanssa.
Ilmiselvästi molemmat toimivat. Voit päättää itse, mistä pidät.
Yksi merkittävä ero
On muutamia asioita, joita uskon, että voit tehdä vain säännöllisen lausekkeen objektilla. Esimerkiksi, jos haluat löytää kaikki säännöllisen lausekkeen esiintymät, sinun täytyy luoda säännöllisen lausekkeen objekti, antaa sille "g"-vaihtoehto ja sitten kutsua re.exec() useita kertoja saadaksesi jokaisen osuman, kunnes exec palauttaa nullin, mikä tarkoittaa, ettei lisää osumia ole. En usko, että voit tehdä sitä string.match():n avulla.
Vastaus #2
On joitakin eroja match- ja exec-metodien välillä käytettäessä globaalia lippua g. Et voi silmukoida globaalien esiintymien läpi match-metodilla, kun taas exec-metodilla voit:
var string="xabx xnnx";
var regexp=new RegExp('x([^x]*)x','g');
// match returns the list of matching parts:
string.match(regexp) // ["xabx", "xnnx"]
// with exec you could build a loop:
var match=regexp.exec(string);
while (match) {
console.log(match);
match=regexp.exec(string);
}
// This loops through matches and returns subpatterns too:
// ["xabx", "ab"]
// ["xnnx", "nn"]
Eikä index toimi lainkaan, kun käytetään match globaalin RegExp-objektin kanssa:
var r=/b/g;
r.exec("0123b56b").index // 4
r.exec("0123b56b").index // 7
"0123b56b".match(r).index // undefined
"0123b56b".match(/b/).index // 4
