2014-12-11 2 views
0

Так у меня есть это регулярное выражение:Nodejs ошибка регулярное выражение: «Недопустимое регулярное выражение: ничего, чтобы повторить»

(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#exclude[ \t]*([^\n*]*)[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)?((?:.|\n|\r)*?)(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#endexclude[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)? 

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

/* #exclude */ 
hurdur = somerandomtextorcode; 
/* #endexclude */ 

Я пытаясь это регулярное выражение в таких инструментах, как https://regex101.com/ (https://regex101.com/r/eA5oK9/1), и там он просто работает, никаких ошибок.

Однако в nodejs среде, я получаю эту ошибку, которую я действительно не знаю, как решить:

Warning: Invalid regular expression: /(?:[  ]*)?(?://|/*)[ ]*#exclude[ 
]*([^ 
]*)[ ]*(?:*/)?(?:[ ]*[ 
]+)?((?:.| 
| 
)?)(?:[   ]*)?(?://|/*)[ ]*#endexclude[ ]*(?:*/)?(?:[ ]*[ 
]+)?/: Nothing to repeat Use --force to continue. 

Любая помощь по этому вопросу будет весьма признателен!

+0

Похоже, '' t 'и' \ n' были взяты буквально. Вы используете 'new Regexp' случайно? – georg

+0

Да, я использую 'new RegExp ('(?: [\ T] *)? (?: \/\/| \/\ *) [\ T] * # exclude [\ t] * ([^ \ n *] *) [\ t] * (?: \ * \ /)? (?: [\ t] * [\ r \ n] +)? ((?:. | \ n | \ r) * ?) (?: [\ t] *)? (?: \/\/\ \/\ *) [\ t] * # endexclude [\ t] * (?: \ * \ /)? (?: [ \ t] * [\ r \ n] +)? ',' gi ') ' , чтобы создать регулярное выражение. Это проблема? –

+1

Да, он превращает '\ n' в литеральные разрывы строк. Либо используйте литерал регулярного выражения '/.../', либо удвоить все обратные косые черты, т. Е. '\\ n' и т. Д. – georg

ответ

1

Хорошо, оказывается, это была проблема, связанная с тем, как я на самом деле был , создавая регулярное выражение.

я создавал (и применение) регулярное выражение, как это:

var rExclude = '(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#exclude[ \t]*([^\n*]*)[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)?((?:.|\n|\r)*?)(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#endexclude[ \t]*(?:\*\/)?(?:[ \t]*[\r\n]+)?'; 

contents = contents.replace(new RegExp(rExclude, 'gi'), function() { return ""; }); 

Это дает мне ошибку, которая описана в исходном сообщении. Однако, поскольку регулярное выражение находится в строке , JavaScript решает, что он хочет обрабатывать регулярное выражение по-разному. Вы можете исправить это двумя способами:

Решение 1 Это решение изменяет способ утечки материала в вашей строке.

var rExclude = '(?:[ \t]*)?(?://|/\\*)[ \t]*#exclude[ \t]*(?:\\*/)?(?:.|\n|\r)*?(?://|/\\*)[ \t]*#endexclude[ \t]*(?:\\*/)?'; 

contents = contents.replace(new RegExp(rExclude, 'gi'), function() { return ""; }); 

Решение 2 Это решение изменяет способ фактическое регулярное выражение создаваемого:

contents = contents.replace(/(?:[ \t]*)?(?:\/\/|\/\*)[ \t]*#exclude[ \t]*(?:\*\/)?(?:.|\n|\r)*?(?:\/\/|\/\*)[ \t]*#endexclude[ \t]*(?:\*\/)?/gi, function() { return ""; }); 

Это просто еще один странный задница JavaScript причуда, к сожалению.

-1

Двойной вверх по вашей обратной косой чертой.

Обратите внимание, как здесь: (?:*/)? нет обратной косой черты? Это означает, что ваш * пытается повторить .. ничего. Нечего повторять.

+0

Это не решение. Эта конкретная часть: (?: * /)? - это строка ошибки. Все символы анализируются через nodejs уже, поэтому вы не заметите, что я на самом деле/​​делаю/убираю эту специальную звездочку. Посмотрите фактическую строку регулярного выражения, чтобы увидеть, что я на самом деле это делаю: p –

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