2016-11-09 5 views
3

Я хотел бы определить, начинается ли файл с нуля или более однострочных комментариев (стиль //), а затем «use strict».Javascript regex: найти первый 'use strict'

Вот моя попытка:

var regex = new RegExp("(\/\/.*$)*\"use strict\";", 'm'); 
var codeblock = 
` 
//hi 
//there 
"use strict"; 
`; 

let match = regex.exec(codeblock); 
console.log(match.index); 

Я бы ожидать match.index быть 0. Однако на самом деле возвращает 14, то есть он не признает мои комментарии. Я подозреваю, что я не использовал повторяющийся шаблон() * правильно, но я не уверен, что я должен использовать?

+0

Что-то может быть неясно. 'файл начинается с нуля или более одной строки'. Итак, 'файл '? 'первый 'использовать строгий', а второй? Лучше, если вы предоставите строку, которую хотите достичь (результат). –

ответ

3

Дело в том, что ваша часть (\/\/.*\r?\n)* не соответствует комментариям, так как вы не потребляете разрывы строк, вы подтверждаете их присутствие только с $. Таким образом, значение группы 0 равно undefined (попробуйте распечатать match[1]), и совпадение находится в позиции 14, то есть "use strict".

Заменить $ с \r?\n и убедитесь, что у вас нет новой строки в начале тестовой строки, и вы получите 0:

var regex = /(\/\/.*\r?\n)*\"use strict\";/m; 
 
var codeblock = 
 
`//hi 
 
//there 
 
"use strict";`; 
 
let match = regex.exec(codeblock); 
 
console.log(match.index);

Я также предлагаю использовать регулярное выражение буквального нотация/(\/\/.*\r?\n)*\"use strict\";/m, а не запись конструктора RegExp, так как ваш шаблон статичен (переменные не используются для создания регулярного выражения).

+0

Ах, блестящий! Я не понимал, что $ не поглотил линию. Благодаря! – Wolf

+0

Помните, если я спрошу, почему '' 'не потребляет линию? –

+1

Потому что '$' - это утверждение с нулевой шириной *. См. [* Глядя в механизм регулярных выражений *) (http://www.regular-expressions.info/anchors.html). –

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