#regex #perl
#регулярное выражение #perl
Вопрос:
Я перебираю файл построчно, выбирая строки, начинающиеся со звездочки : *
. Мое простое регулярное выражение работает для всех строк, кроме самой первой строки файла.
ЖЕЛАЕМОЕ ПОВЕДЕНИЕ: регулярное выражение должно правильно соответствовать строкам, начинающимся со звездочки.
ФАКТИЧЕСКОЕ ПОВЕДЕНИЕ таково: если звездочка встречается в самой первой строке файла, регулярное выражение не соответствует.
Мои ПОПЫТКИ ОТЛАДКИ включают:
- Добавьте пустую строку в начало файла. РЕЗУЛЬТАТ: ранее пропущенная строка, теперь во второй строке файла, правильно сопоставлена регулярным выражением.
- Удалите
A
из regexp, просто сопоставьте со звездочкой. Теперь первая строка файла правильно сопоставляется регулярным выражением. - Попробуйте использовать
^
вместоA
. Первая строка файла по-прежнему не соответствует.
МИНИМАЛЬНЫЙ КОД ДЛЯ ВОСПРОИЗВЕДЕНИЯ:
while (<$input_fh>) {
chomp;
$line = $_;
if ($line =~ /A*/) {
...
}
}
Входной файл состоит из строк текста, которые могут начинаться или не начинаться со звездочки.
Комментарии:
1. Разве ваш файл не содержит спецификацию?
2. Потому что спецификация длиннее одного байта (фактическое количество байтов зависит от кодировки).
3. Когда у вас возникают эти проблемы, проверка строки с помощью Data::Dumper или Devel::Peek может выявить такие проблемы.
4. Data::Dumper with
$Data::Dumper::Useqq = 1;
— это то, что вы хотите. (Devel::Peek может помочь в отладке модулей XS. Здесь не проблема.)5. Вы также можете использовать
perlstring
функцию из основногоB
модуля, чтобы узнать, что Perl считает вашей строкой.use B "perlstring"; printf "read line: %sn", perlstring $line;
Ответ №1:
/A*/
соответствует началу строки, а затем символу звездочки.
Вам нужно сопоставить любые символы между началом и звездочкой.
Использовать
/A.*?*/
Смотрите доказательство
Объяснение
--------------------------------------------------------------------------------
A the beginning of the string
--------------------------------------------------------------------------------
.*? any character except n (0 or more times
(matching the least amount possible))
--------------------------------------------------------------------------------
* '*'
Комментарии:
1. Это не отвечает на вопрос!