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
