2015-09-17 2 views
2

"/ *" [^ * /] * "* /"Почему это сообщение Regex не так?

Это совпадает с первой/*, то он ждет любого символа для * /, за исключением, а затем, когда он получает */он будет полностью совпадать с регулярным выражением, бур на этот комментарий, например:

/* Брюно/Braga */

Может кто-нибудь сказать мне, почему/Dont матч? Спасибо.

+1

IMHO, вы забыли, что '*' является специальным символом и должен быть экранирован, чтобы соответствовать литералу. Попробуйте использовать '/ \ * (?: (?! \ */|/\ *) [\ S \ S]) * \ * /' или более простой '/ \ * [\ s \ S] *? \ */'. Если у вас нет символов новой строки в комментариях, попробуйте использовать '/\*.*?\*/'. –

+0

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

ответ

0

Почему это комментарий Regex не так?

Это из-за нескольких проблем с регулярным выражением:

  1. все ненужные кавычки " внутри него
  2. при запуске класс символов со знаком отрицания: [^] это сводит на нет все, что в нем, в вашем примере это также отрицает пространство, потому что вы включили его. Кроме того, символ / существует в середине строки ввода, и вы, вероятно, хотите запретить его только тогда, когда он следует * в контексте «завершения комментарий "- */.
  3. как stribizhev, уже упомянутый в комментариях выше - * является особым символом и должен быть экранирован.То же самое относится и к /
  4. Пространство, которое существует в регулярном выражении сразу после /* (строка ввода /*bruno... не содержит такого пространства)
  5. Пространство между последней звездой и слэш, закрывающей комментарий: * /

Суммируя все вышеуказанные пункты, то регулярное выражение должно быть исправлено на:

\/\*[^\*]*\*\/ 

См DEMO


Вслед за комментарием Луиса: если вы хотите, чтобы * символ внутри комментария, вы можете использовать:

\/\*(.*?)\*\/ 

См DEMO

+0

@ LuisColorado правда, но такого требования не было. Если OP считает, что символ '*', скорее всего, будет частью комментария, это требование должно быть добавлено к вопросу :) – alfasin

+0

Но предполагается, что он захочет получить правильный ответ, не имея дело с проблемой, когда он видит, что включение '*' аннулирует всю строку соответствия. Даже если он не был указан как таковой, комментарий языка C позволяет помещать символы '*' внутри. –

+0

Это редактирование заставит его принять '/ * bla bla *// * bla bla */'как целый комментарий, а не два комментария с пробелом между ними. Посмотрите на мое решение, поскольку я также ответил на этот вопрос. –

0

Корректная регулярное выражение, чтобы соответствовать комментарий (разрешая все внутри, но последовательность */, вы должны сначала разрешить любой символ, кроме *, или *, а затем ничего, кроме /, так

/\*([^\*]|\*[^/])*\*/ 

См Demonstration

должны делать свою работу (помните, что в демонстрации регулярных выражений разделители / поэтому они экранируются обратным слэшем, возможно, вам придется сделать это, чтобы избежать в вашем коде.

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