2009-11-16 5 views
2

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

#include <source.h> 

/* this is a comment */ 

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

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

multi = /^\/\*/ 

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

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

ответ

5

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

multi = /\A\/\*/ 
+1

Этот вид sux. Является ли это только рубином или все языки имеют это? – Geo

+0

В большинстве языков есть переключатель под названием «многострочный режим», который заставляет их вести себя так, но Ruby - единственный, который я знаю, который делает это по умолчанию. Многострочный режим Perl выглядит так: '/^test/m' – Andomar

3

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

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

+0

Это то же самое в Perl/Python? – Geo

+0

В Perl/Python поведение '^' зависит от используемых модификаторов режима ('/ m' в Perl или' re.MULTILINE' в Python). –

0

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

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

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

1

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

multi = "/*" 
data = File.read(filename) 
if data[0..2] == multi 
    puts "file starts with multiline header" 
end 
+0

Поскольку перед началом комментария могут присутствовать дополнительные пробелы. Регулярное выражение заключалось в том, чтобы выяснить, почему Ruby вел себя так. – Geo

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