Nano Hash - криптовалюты, майнинг, программирование

Сопоставление всех трех типов комментариев PHP с помощью REGEX

Я новичок в REGEX, и мне нужна помощь.

Мне нужно сопоставить все три типа комментариев, которые могут быть в PHP:
# Single line comment
// Single line comment
/* Multi-line comments */

/**
 * And all of it's possible variations
 */

Что-то, что я должен упомянуть, я делаю это для того, чтобы иметь возможность распознать, находится ли закрывающий тег PHP (?>) внутри комментария или нет, если это так, то игнорируйте его, если нет, то считайте его одним. Это будет использоваться внутри XML-документа, чтобы улучшить распознавание Sublime Text закрывающего тега (потому что это сводит меня с ума!). Я пытался добиться этого пару часов, но не смог, поэтому, если бы вы могли перевести его для работы с XML, я был бы признателен. :)

Поэтому, если бы вы также включили логин if-then-else, я был бы очень признателен. Кстати, мне действительно нужно, чтобы это было в чистом выражении REGEX, без языковых функций или чего-то еще. :)

Как напомнил мне Eicon, мне нужно, чтобы все они могли сопоставляться в начале строки или в конце фрагмента кода, поэтому мне также нужно следующее для всех них:

<?php
echo 'something'; # this is a comment
?>

Любая помощь будет оценена по достоинству. :)


  • хотите также соответствовать `$var=value; #комментарий ? 29.10.2012
  • @eicto Да, спасибо, добавлю. 29.10.2012
  • @Dagon Этот пост на самом деле не содержит того, что мне нужно, потому что мне нужно, чтобы он был чистым REGEX без каких-либо языковых функций между ними. 29.10.2012

Ответы:


1

Парсинг языка программирования кажется слишком сложным для регулярных выражений. Вероятно, вам следует поискать парсер PHP.

Но это будут регулярные выражения, которые вы ищете. Я предполагаю, что для всех из них вы используете параметр DOTALL или SINGLELINE (хотя первые два будут работать и без него):

~#[^\r\n]*~
~//[^\r\n]*~
~/\*.*?\*/~s

Обратите внимание, что любой из них вызовет проблемы, если символы, разделяющие комментарий, появятся в строке или где-то еще, где они на самом деле не открывают комментарий.

Вы также можете объединить все это в одно регулярное выражение:

~(?:#|//)[^\r\n]*|/\*.*?\*/~s

Если вы используете какой-либо инструмент или язык, не требующий разделителей (например, Java или C#), удалите эти ~. В этом случае вам также придется применить опцию DOTALL по-другому. Но не зная, где вы собираетесь это использовать, я не могу сказать вам, как.

Если вы не можете/не хотите устанавливать параметр DOTALL, это будет эквивалентно (я также не использовал разделители для примера):

(?:#|//)[^\r\n]*|/\*[\s\S]*?\*/

см. здесь рабочую демонстрацию.

Теперь, если вы также хотите захватить содержимое комментариев в группе, вы можете сделать это

(?|(?:#|//)([^\r\n]*)|/\*([\s\S]*?)\*/)

Независимо от типа комментария его содержимое (без разделителей синтаксиса) будет найдено в захвате 1.

Еще одна рабочая демонстрация.

28.10.2012
  • Это будет использоваться внутри XML-документа, чтобы улучшить распознавание Sublime Text закрывающего тега (потому что это сводит меня с ума!). Я пытался добиться этого пару часов, но не смог, поэтому, если бы вы могли перевести это на правильный язык, я был бы признателен. :) 29.10.2012
  • Хм, извините, я не знаком с вашим вкусом регулярных выражений. Но это было бы эквивалентно без необходимости устанавливать параметр DOTALL (и если вам не нужны разделители): (?:#|//)[^\r\n]*|/\*[\s\S]*?\*/ 29.10.2012
  • @EduardoLávaque Я отредактировал это в вопросе вместе с рабочей демонстрацией. 29.10.2012
  • Спасибо! Это хорошая отправная точка. :) РЕДАКТИРОВАТЬ: Хорошо, спасибо! :) EDIT2: не работает для того, что мне нужно, но это очень хорошая отправная точка. :) 29.10.2012

  • 2

    Старый вопрос, но, может быть, это поможет кому-то еще...

    Однострочные комментарии

    singleLineComment = /'[^']*'|"[^"]*"|((?:#|\/\/).*$)/gm
    

    С помощью этого регулярного выражения вы должны заменить (или удалить) все, что было захвачено ((?:#|\/\/).*$). Это регулярное выражение будет игнорировать содержимое строк, которые выглядят как комментарии (например, $x = "You are the #1"; или $y = "You can start comments with // or # in PHP, but I'm a code string";).

    Многострочные комментарии

     multilineComment = /^\s*\/\*\*?[^!][.\s\t\S\n\r]*?\*\//gm
    
    25.10.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..