Почему это регулярное выражение не работает должным образом? - PullRequest
2 голосов
/ 16 ноября 2009

У меня есть это регулярное выражение: ^\/\*, чтобы проверить и посмотреть, содержит ли файл эти два символа в начале. Я перебираю множество исходных файлов c ++, пытаясь понять, какие из них содержат это. Проблема в том, что если файл содержит это:

#include <source.h>

/* this is a comment */

это также соответствует регулярному выражению. Я не понимаю почему, так как регулярное выражение не имеет многострочного флага.

Вот код для регулярного выражения:

multi = /^\/\*/

Почему это совпадение не только в начале текста? Вот в основном все, что я делаю:

data = File.read(filename)
if data =~ multi
   puts "file starts with multiline header"
end

Ответы [ 4 ]

5 голосов
/ 16 ноября 2009

В Ruby ^ соответствует после каждой новой строки. Используйте \A для соответствия только в начале всей строки:

multi = /\A\/\*/
3 голосов
/ 16 ноября 2009

Используйте \A (начало строки) вместо ^ (начало строки).

Интерпретация ^ не полностью соответствует между вкусами. Иногда вам нужно установить модификатор режима для многострочных строк, но не всегда. \A согласуется (хотя доступно не во всех вариантах, но большинство из них. Исключением являются XML, POSIX ERE / BRE и некоторые другие).

1 голос
/ 16 ноября 2009

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

multi = "/*"
data = File.read(filename)
if data[0..2] == multi
   puts "file starts with multiline header"
end
0 голосов
/ 16 ноября 2009

Я не знаю о внутренностях рубина, но попробуйте это:

/ ^ [^ A-Za-Z # <>] / * /

Первая часть гарантирует, что любой допустимый символ не найден перед вашим многострочным комментарием. Обратите внимание, что [^ a-zA-Z # <>] является лишь примером, вы должны дополнить его допустимой комбинацией.

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