2016-01-17 2 views
3

Я знаю, как удалить комментарии из текста, но я ищу что-то другое.Выделить все, кроме комментариев

Я хочу выбрать все, кроме кода.

Я использовал следующее регулярное выражение:

/^(?!(\/\*([\s\S]+)\*\/)).*/gm 

Вы можете проверить его здесь: https://regex101.com/r/cN5aT1/2

Но это не работает с многострочные комментарии ...

+1

** Я не хочу выбирать комментарии ** ... Я хочу, чтобы все остальное, кроме комментариев! .. Спасибо – duckduckgo

+0

Могут ли комментарии быть где угодно, например, также в середине строки? – lex82

+0

@torazaburo: вы не знаете, где этот код используется. Для downvote также приводятся причины (это не JS - это CSS) или действительные контрпримеры (они приветствуются). –

ответ

3

Это имеет смысл replace комментарии от текст вместо \/\*.*?\*\/.

Хотя, если вы хотите, и при условии, что это не будет идти в свой производственный код, который вы можете попробовать

/([^*\/][^*\/][^*\/]*)(?=\/\*.*?\*\/|$)/gs 

https://regex101.com/r/cN5aT1/6

+0

Он не выбирает текст после последнего комментария. – lex82

+1

JS не поддерживает модификатор '/ s' dotall. Кроме того, для длинных многострочных комментариев это регулярное выражение будет работать очень медленно или может даже заморозить приложение из-за подзапроса с ленивой точкой. –

+0

@ lex82 исправлено. спасибо .. @stribizhev Чтобы исправить это, мы можем использовать [\ s \ S] вместо '.' Хотя, как я уже упоминал, его более логично заменить ... Оба с точки зрения производительности и ошибки – Anirudha

1

раздеть комментарии

Удалить каждые Css комментарии (в или дополнительном блоке и со звездами * внутри) с использованием функции replace со следующим регулярным выражением:

/\s*[/][*](?:[^*]|[*][^/])*[*][/][ \t]*/g 

Regex BreakoutRegex101 Demo

/     # Regex start delimiter 
\s*    # select any whitespace char (including the newlines preceding the comment) 
[/][*]    # match comment start delimiter '/*' 
(?:[^*]|[*][^/])* # select zero or more not star ('*') chars (also newlines) 
        # or a star and the following char (that is not '/') 
[*][/]    # match comment stop delimiter '*/' 
[ \t]*    # match any space or tabs (no newlines to preserve indentations) 
/g     # Regex close delimiter and global flag 

О выполнении: Код ниже 14 раз быстрее, чем код, предложенный в другом ответе с ленивым модификатором:

Живая Js Demo

var filter = /\s*[/][*](?:[^*]|[*][^/])*[*][/][ \t]*/g; 
 
var input = '.class-n {\n\n}\n\n/* Select everything but these comments */\n\n.class-1 {\n font-family: \'SourceCodePro\';\n font-size: 16px; /* a comment with\n **stars***** */\n line-height: 18px;\n}\n\n/* Select everything but these comments */\n\n.class-2 {\n background-color: rgb(40, 40, 40); /* another\n inline comments that\nspans on multiple lines */\n border: 1px solid rgb(20, 20, 20);\n padding: 10px 15px 10px 15px;\n}\n\n/* Single line */\n\n/* Multiline\n Comment */\n'; 
 

 
var output = input.replace(filter,''); 
 

 
document.getElementById('input').innerHTML += '<xmp>' + input + '</xmp>'; 
 
document.getElementById('output').innerHTML += '<xmp>' + output + '</xmp>';
.flexbox-container { 
 
\t display: -ms-flex; 
 
\t display: -webkit-flex; 
 
\t display: flex; 
 
} 
 

 
.flexbox-container > div { 
 
\t width: 50%; 
 
\t padding: 15px; 
 
    border:1px solid black; 
 
} 
 

 
.flexbox-container > div:first-child { 
 
\t margin-right: 15px; 
 
}
<div class="flexbox-container"> 
 
\t <div id="input"><h3>Original Css</h3></div> 
 
\t <div id="output"><h3>Stripped Css</h3></div> 
 
</div>

1

очень быстрое и легкое решение, чтобы получить текст, который не должен быть согласован с конкретным рисунком используется String#split().

Так, the best regex to match /* */ comments я знаю

/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//g 

Затем просто разделить вход с регулярным выражением:

var re = /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//g; 
 
var s = '.class-n {\n\n}\n\n/* I want to select everything but these comments */\n\n.class-1 {\n font-family: \'SourceCodePro\'; \n font-size: 16px;\n line-height: 18px;\n}\n\n/* I want to select everything but these comments */\n\n.class-2 {\n background-color: rgb(40, 40, 40);\n border: 1px solid rgb(20, 20, 20);\n padding: 10px 15px 10px 15px;\n}\n\n/* Single line */\n\n/* Multiline\n Comment */\n\nSome text here'; 
 
var res = s.split(re).filter(Boolean); 
 
document.body.innerHTML += "<pre>"+JSON.stringify(res, 0, 4)+"</pre>";

0

Детектирование комментарии в JavaScript не является тривиальным решением , вы не можете полагаться только на RegEx для этого.Только правильный парсер, например Esprima, может сделать это правильно.

Самый простой способ использования кода/содержимого со всеми его комментариями удален.

Для этого вы можете использовать библиотеку decomment. Это гарантирует удаление корректных комментариев, поскольку он опирается на Esprima идентифицировать все регулярные выражения:

var decomment = require('decomment'); 

var code = "var t; // comments"; 

decomment(code); //=> var t; 

Для систем сборки/бегуны задач см gulp-decomment и grunt-decomment.

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