2016-03-20 10 views
-1

ich für einen regulären Ausdruck suchen, die jede Zeile Code übereinstimmen kann, die einen einzigen Verweis auf ein Kernmodul enthält)Regex Ausdruck nicht Linie Node.js Code übereinstimmen

Etwas wie folgt aus:

const coreModuleMatches = /'^[var|const]{0,1}[a-z\$\_]{1,}=require([\'|"][assert|fs|path][\'|"])[;|,]{0,1}$/; 

Dies sollte

var pth = require("path"); 
const asrt = require('assert'), 
    fs = require('fs'), 
    cp = require('child_process'); 

das Problem ist, alle diese Linien entsprechen ich nicht die einfache regex arbeiten kann, so meine komplexere regex derzeit keine Hoffnung hat.

Ich entferne alle Leerräume außer Newline-Zeichen, bevor ich den Code mit regulären Ausdrücken abgleiche, und teile dann Zeilenumbrüche, damit ich Zeile für Zeile durch den Code gehen kann. Irgendwelche Ideen willkommen.

+4

Sie habe vergessen zu entkommen '(' und ')'. –

+0

Ist String von 'var. . . . . ('child_process'); 'ein Match oder zwei verschiedene Matches? –

+0

http://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in-regular-expressions und http: // stackoverflow.com/questions/9801630/Was ist der Unterschied zwischen eckigen Klammern und Klammern in einem Regex –

Antwort

1

Neben dem Vergessen zu entkommen ( und ) gab es einige Fehler in Ihrem Regex zu.

Ihre Regex:

/'^[var|const]{0,1}[a-z\$\_]{1,}=require([\'|"][assert|fs|path][\'|"])[;|,]{0,1}$/

Mein Regex:

/^(?:var|const)\s*([a-z$_]+\s*=\s*require\(('|")(?:assert|fs|path|child_process)\2\),?[\n\r\t\s]*)*;$/

Erläuterung:

  • (?:var|const)\s*([a-z$_]+\s*=\s* Dies entspricht von var oder const bis zum Variablennamen gefolgt von = einschließlich aller Leerzeichen.

  • require\(('|")(?:assert|fs|path|child_process)\2\),? Dies entspricht der require() und was auch immer das Modul darin ist. Da die erste quote unter Verwendung von ('|") erfasst wird, deutet \2 an, dass es sich beim Schließen auch wiederholt, so dass eine Nichtübereinstimmung von Anführungszeichen nicht stattfindet.

  • [\n\r\t\s]*)*; Dies entspricht allen Leerzeichen in der zweiten Variablen, die aus Zeilenumbrüchen, Tabulatoren, Leerzeichen und Zeilenumbrüchen bestehen.

Regex101 Demo

+0

danke, ich muss eigentlich keine whitespace passen. Wenn Sie Ihre Regex vereinfachen könnten, indem Sie Leerraum-Übereinstimmungen entfernen und erklären, wie Ihre funktioniert, würde das helfen! –

+0

@AlexMills: Welche Leerzeichen möchten Sie entfernen? In deiner Frage haben die Übereinstimmungen von "const ....." bis zum Ende viele Leerzeichen. Außerdem hast du meinen Kommentar zu deiner Frage nicht beantwortet. –

+0

Ja, mach dir darüber keine Sorgen, es funktioniert immer noch mit dem optionalen Leerzeichen ... Ich weiß nicht, was das '\ 2 \' tut. Ihre Antwort wird wahrscheinlich niemandem helfen, es sei denn, Sie können die Regex ein wenig erklären, danke –

1

Sie benötigen keine regex müssen so kompliziert, so etwas wie /("|')(assert|fs|http)\1/ sollte genug sein:

// don't list all modules by hand 
var builtinModules = require('builtin-modules'); 

console.time('end'); 
var input = 
`var pth = require("path"); 
var _ = require('lodash'); 
const asrt = require('assert'), 
fs = require('fs'), 
cp = require('child_process');`.split('\n'); 

// \1 is a reference to the matched beginning (double)quote 
// to prevent something like "path'/'fs" to match 
var rgxStr = `("|')(${ builtinModules.join('|') })\\1`; 
var rgx = new RegExp(rgxStr); 
// console.log(rgxStr); // uncomment to see how the Regex looks like 

var output = input.filter((line) => line.match(rgx)); 

console.timeEnd('end'); 
console.log('input'); 
console.log(input); 
console.log('--------------------------------------'); 
console.log('output'); 
console.log(output); 

Ausgang:

end: 0.428ms 
input 
[ 'var pth = require("path");', 
    'var _ = require(\'lodash\');', 
    'const asrt = require(\'assert\'),', 
    'fs = require(\'fs\'),', 
    'cp = require(\'child_process\');' ] 
-------------------------------------- 
output 
[ 'var pth = require("path");', 
    'const asrt = require(\'assert\'),', 
    'fs = require(\'fs\'),', 
    'cp = require(\'child_process\');' ] 
+0

Sie möchten keine Anführungszeichen ** angeben. Verwenden Sie Rückverweis auf erfasste Gruppen. –

+0

Ich bekomme diese Ausgabe, bei dieser Eingabe: –

+0

Eingabe: var assert = require ('assert'); const fs = erfordern ('fs'); –

Verwandte Themen