Hur kan jag sammanfoga regex-litteraler i JavaScript?
Är det möjligt att göra något sådant?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
Eller måste jag använda ny RegExp()-syntax och sammanfoga en sträng? Jag skulle föredra att använda literal eftersom koden både är mer självklar och koncis.
Svar #1
Här är hur man skapar ett reguljärt uttryck utan att använda den reguljära uttryckssyntaxen med literal. Detta låter dig göra godtycklig strängmanipulation innan det blir ett reguljärt uttrycksobjekt:
var segment_part = "some bit of the regexp";
var pattern = new RegExp("some regex segment" + /*comment here */
segment_part + /* that was defined just now */
"another segment");
Om du har två reguljära uttryckslitteraler kan du faktiskt sammanfoga dem med denna teknik:
var regex1 = /foo/g;
var regex2 = /bar/y;
var flags = (regex1.flags + regex2.flags).split("").sort().join("").replace(/(.)(?=.*\1)/g, "");
var regex3 = new RegExp(regex1.source + regex2.source, flags);
// regex3 is now /foobar/gy
Det är bara mer ordrikt än att bara ha uttryck ett och två som bokstavliga strängar istället för bokstavliga reguljära uttryck.
Svar #2
Att bara slumpmässigt sammanfoga reguljära uttrycks objekt kan ha vissa negativa bieffekter. Använd istället RegExp.source:
var r1 = /abc/g;
var r2 = /def/;
var r3 = new RegExp(r1.source + r2.source,
(r1.global ? 'g' : '')
+ (r1.ignoreCase ? 'i' : '') +
(r1.multiline ? 'm' : ''));
console.log(r3);
var m = 'test that abcdef and abcdef has a match?'.match(r3);
console.log(m);
// m should contain 2 matchesDetta kommer också att ge dig möjlighet att behålla de reguljära uttrycksflaggorna från ett tidigare RegExp med hjälp av de standardiserade RegExp-flaggorna.
jsFiddle
Svar #3
Jag håller inte riktigt med om 'eval'-alternativet.
var xxx = /abcd/;
var yyy = /efgh/;
var zzz = new RegExp(eval(xxx)+eval(yyy));
kommer att ge "//abcd//efgh//" vilket inte är det avsedda resultatet.
Använder källa som
var zzz = new RegExp(xxx.source+yyy.source);
kommer att ge "/abcdefgh/" och det är korrekt.
Logiskt sett finns det inget behov av att UTVÄRDERA, du känner till ditt UTTRYCK. Du behöver bara dess KÄLLA eller hur det är skrivet, inte nödvändigtvis dess värde. När det gäller flaggorna behöver du bara använda det valfria argumentet i RegExp.
I min situation stöter jag på problemet med ^och $ som används i flera uttryck som jag försöker sammanfoga! De uttrycken är grammatikkontroller som används i hela programmet. Nu vill jag använda några av dem tillsammans för att hantera fallet med PREPOSITIONER. Jag kan behöva "slica" källorna för att ta bort början och slutet ^( och/eller )$ :) Hälsningar, Alex.
