javascript - Je li bolje koristiti metode na RegExp objektima ili na String objektima?


Postoje metode podudaranja s regexom na obje RegExp i String objekte u JavaScriptu.

Objekti RegExp imaju metode

  • izvrši
  • test

Objekti String imaju metode

  • utakmica
  • traži

Metode exec i match su vrlo slične:

/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"]

i test i search su također vrlo slični:

/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

Postoji li preferencija za korištenje metoda na RegExp objektima ili na String objektima?

Odgovor #1

Uglavnom osobni izbor

Ovo je uglavnom osobna preferencija, iako postoji mala razlika u sposobnostima (pogledajte posljednji odlomak za tu razliku). Osim ako ne želite početi mjeriti performanse i pretvoriti pitanje u pitanje performansi, ovo je uglavnom osobna preferencija.

Radije bih učinio:

string.match(/word/)

jer mislim da to čini da kod izgleda kao što moj mozak razmišlja o operaciji. Uzimam objekt string i tražim određeni regularni izraz u njemu. Ima smisla za mene da traženje nečega u stringu bude metoda na string objektu. Ovo mi se čita kao:

object.action(tool)

što je po mom mišljenju način na koji bi objektno orijentirani kod trebao raditi.

Ako imate:

/word/.match(string)

onda meni to izgleda kao:

tool.action(object)

što smatram puno manje logičnim i manje orijentiranim na objekte. Da, /word/ tehnički je također objekt, ali nije objekt na kojem pokušavam raditi, više ga doživljavam kao alat ili parametar koji koristim s mojim objektom.

Očigledno oboje funkcionira. Možete sami odlučiti što vam se više sviđa.

Jedna velika razlika

Postoje neke stvari za koje vjerujem da ih možete učiniti samo s objektom regularnog izraza. Na primjer, ako želite pronaći sve pojave regularnog izraza, morate stvoriti objekt regularnog izraza, proslijediti mu opciju "g" i zatim više puta pozivati re.exec() kako biste dobili svaki podudaranje dok exec ne vrati null, što znači da više nema podudaranja. Mislim da to ne možete učiniti s string.match().

Odgovor #2

Postoje neke razlike između match i exec pri korištenju globalne zastavice g. Ne možete prolaziti kroz globalne pojave s match, dok s exec možete:

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"]

I index uopće ne radi kada se koristi match s globaliziranim RegExp objektom:

var r=/b/g;
r.exec("0123b56b").index // 4
r.exec("0123b56b").index // 7
"0123b56b".match(r).index // undefined
"0123b56b".match(/b/).index // 4