javascript - Syntaxfel i reguljärt uttryck


Jag skapar ett regex dynamiskt.

    var link = "www.google.com";
    var reg = '^'+link+'{1}|(?<=\s)'+link+'{1}(?=\s)|'+link+'{1}$';
    console.log(reg);
    var result = new RegExp(reg, 'g');

Jag får det här felet

Uncaught SyntaxError: Invalid regular expression: /^www.google.com{1}|(?<=s)www.google.com{1}(?=s)|www.google.com{1}$/: Invalid group

Här är den genererade regexen:

^www.google.com{1}|(?<=s)www.google.com{1}(?=s)|www.google.com{1}$

Svar #1

JavaScript:s regexmotor stödde inte look-behinds överhuvudtaget innan ECMAScript 2018 släpptes.

Nu, om du använder detta i Chrome, kommer det inte att ge något fel nu:

var link = "www.google.com";
var reg = '^'+link+'{1}|(?<=\s)'+link+'{1}(?=\s)|'+link+'{1}$';
console.log(reg);
var result = new RegExp(reg, 'g');

En annan sak: du måste dubbelt escape \ inom RegExp-konstruktorn.

Det du försöker uppnå är att få URL:en att matcha vid ordgränser.

Försök använda

RegExp.escape= function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};

var reg = '\\b'+RegExp.escape(link)+'\\b';

Kod :

RegExp.escape= function(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    };

var link = "www.google.com"
var reg = '\\b'+RegExp.escape(link)+'\\b';
alert(new RegExp(reg, "g"));

Obs Jag lägger till RegExp.Escape för att undvika specialtecken i de argument som skickas till RegExp-konstruktorn (t.ex. . måste vara \\.).

Svar #2

JavaScript stöder inte bakåtblickande grupper.

Förutom det byggs ditt reguljära uttryck upp från strängar. Du måste se till att dina reguljära uttryck-metatecken "överlever" processen med strängkonstantparsning, och särskilt måste ditt \s uttryckas som \\s.

Observera också att . tecknen i URL-delen av ditt mönster kommer att tolkas som regex "wildcard"-symbolen om du inte föregår dem med \\ också.

Slutligen är det inte klart vad du förväntar dig att de {1} sakerna ska göra; i JavaScript kommer det att matcha teckensekvensen {1}.