Ruby регулярное выражение для поиска комментариев? - PullRequest
3 голосов
/ 03 мая 2011

Я был в этом весь день, и я не могу понять это. У меня есть немного кода Ruby в строке ниже, и я хотел бы только сопоставлять строки с кодом на них и первым комментарием к коду, если он существует.

# Some ignored comment.
1 + 1 # Simple math (this comment would be collected) # ignored 
# ignored

user = User.new
user.name = "Ryan" # Setting an attribute # Another ignored comment

И это будет захватывать:

    1. "1 + 1"
    2. "Simple math"
    1. "user = User.new"
    2. nil
    1. "user.name = "Ryan"
    2. "Setting an attribute"

Я использую /^\x20*(.+)\x20*(#\x20*.+\x20*){1}$/ для сопоставления с каждой строкой, но, похоже, это не работает для всего кода.

Ответы [ 2 ]

3 голосов
/ 01 августа 2012

Ответ Коби частично работает, но не соответствует строкам кода, в которых нет комментария в конце.

Он также потерпит неудачу, когда встретится с интерполяцией строк, например ::10000

str = "My name is #{first_name} #{last_name}" # first comment

... будет ошибочно сопоставлено как: str = "My name is #{first_name}

Вам нужно более полное регулярное выражение. Вот одна идея:

/^[\t ]*([^#"'\r\n]("(\\"|[^"])*"|'(\\'|[^'])*'|[^#\n\r])*)(#([^#\r\n]*))?/
  • ^[\t ]* - ведущие пробелы.
  • ([^#"'\r\n]("(\\"|[^"])*"|'(\\'|[^'])*'|[^#\n\r])*) - соответствует строке кода.
    Разбивка:
    • [^#"'\r\n] - первый символ в строке кода, и ...
    • "(\\"|[^"])*" - строка в двойных кавычках или ...
    • '(\\'|[^'])*' - строка в одинарных кавычках или ...
    • [^#\n\r] - любой другой символ вне строки в кавычках, который не является # или окончанием строки.
  • (#([^#\r\n]*))? - Соответствует первому комментарию в конце строки кода, если есть.

Из-за более сложной логики это будет захватывать 6 подшаблонов для каждого совпадения. Подшаблон 1 - это код, подшаблон 6 - комментарий, остальные можно игнорировать.

С учетом следующего блока кода:

# Some ignored comment.
1 + 1 # Simple math (this comment would be collected) # ignored 
# ignored

user = User.new
user.name = "Ryan #{last_name}" # Setting an attribute # Another ignored comment

Приведенное выше регулярное выражение выдает следующее (для краткости я исключил подшаблоны 2, 3, 4, 5):


  1. 1. 1 + 1
    6. Simple math (this comment would be collected)

  2. 1. user = User.new
    6.

  3. 1. user.name = "Ryan #{last_name}"
    6. Setting an attribute

Демо: http://rubular.com/r/yKxEazjNPC

2 голосов
/ 03 мая 2011

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

^[\t ]*[^\s#][^#\n\r]*#([^#\n\r]*)

, который гласит:

  • [\t ]* - ведущие пробелы.
  • [^\s#] - один действительный символ.Это должно соответствовать коду.
  • [^#\n\r]* - Символы до знака #.Все что угодно, кроме хеша или новых строк.
  • #([^#\n\r]*) - «Первый» комментарий, захваченный в группе 1.

Рабочий пример: http://rubular.com/r/wNJTMDV9Bw

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...