2016-03-20 2 views
-1

Я ищу регулярное выражение, которое может соответствовать любой строке кода, который содержит ни одной ссылки на основной модуль)Regex выражение не соответствует линии Node.js кода

Что-то вроде этого:

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

Это должно соответствовать всем этим линиям

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

проблема в том, что я не могу получить простое регулярное выражение для работы, так что мой более сложным регулярное выражение в настоящее время не имеет никакой надежды.

Я удаляю все пробелы, кроме символов новой строки, перед тем, как сопоставить код с регулярными выражениями, а затем разделим на новую строку, чтобы я мог идти по строкам через код. Любые идеи приветствуются.

+4

You забыл сбежать '(' и ')'. –

+0

Строка из 'var. , , , , ('child_process'); 'один матч или два разных матча? –

+0

http://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in-regular-expressions и http: // stackoverflow.com/questions/9801630/what-is-the-difference-between-square-brackets-and-roundheses-in-a-regex –

ответ

1

Помимо позабыв избежать ( и ) были несколько ошибки в своем регулярном выражении тоже.

Ваш Regex:

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

Мой Regex:

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

Объяснение:

  • (?:var|const)\s*([a-z$_]+\s*=\s* Это соответствие от var или const до имени переменной, за которым следует = включая все пробелы.

  • require\(('|")(?:assert|fs|path|child_process)\2\),? Это соответствует require() и независимо от того, какой модуль находится внутри него. Поскольку первый quote захвачен с использованием ('|"), \2 подразумевает, что он повторяется при закрытии, так что несоответствие кавычек не происходит.

  • [\n\r\t\s]*)*; Это соответствует всем пробелам во второй переменной, состоящей из новых строк, вкладок, пробелов, возвратов каретки.

Regex101 Demo

+0

спасибо, мне действительно не нужно сопоставлять пробелы. Если вы можете упростить свое регулярное выражение, удалив пробелы и объясните, как ваши работы помогут! –

+0

@AlexMills: Какие пробелы вы хотели бы удалить? В вашем вопросе совпадение от 'const .....' до конца имеет много пробелов. Кроме того, вы не ответили на мой комментарий по вашему вопросу. –

+0

Да, не беспокойтесь об этом, он по-прежнему работает с необязательным пробелом ... Я не знаю, что делает '\ 2 \'. Ваш ответ вряд ли поможет кому-либо, если вы не можете немного объяснить регулярное выражение, спасибо –

1

Вам не нужно регулярное выражение, настолько сложна, что-то вроде /("|')(assert|fs|http)\1/ должно быть достаточно:

// 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); 

Выход:

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

Вы не хотите рассортировать ** цитаты **. Используйте обратную ссылку для захваченных групп. –

+0

Я получаю этот вывод, учитывая этот ввод: –

+0

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

Смежные вопросы