У вас две проблемы. Во-первых, .+
является жадным, что означает, что если он используется для поиска одной строки из файла, он сожрет столько символов, сколько сможет (кроме символов новой строки), но все же обеспечит совпадение, что означает совпадение с последним di git.
Вторая проблема заключается в том, что если вы прочитаете файл в строку и выполните поиск в строке, .*
не будет go за первой строкой, потому что он не будет соответствовать символам новой строки. Это можно легко решить, добавив многострочный модификатор (/m
), который указывает .*
на соответствие всем символам, включая символы новой строки.
Если вы читаете свой файл в строку, вы можете использовать следующие регулярные выражения для извлеките интересующие символы из строки.
r = /
^ # match beginning of line
[ ]* # match 0+ spaces
\| # match a toothpick
[ ]+ # match 1+ spaces
total # match 'total'
[ ]+ # match 1+ spaces
\| # match a toothpick
[ ]+ # match 1+ spaces
\K # forget everything matched so far
\d+ # match a digit
(?:\.\d+) # match '.' then 1+ digits in non-capture group
? # optionally match the non-capture group
(?= # begin a positive lookahead
% # match '%'
[ ]+ # match '%' then 1+ spaces
\|[ ]* # match a toothpick then 0+ spaces
$ # match end-of-line
) # end positive lookahead
/x # free-spacing mode
Я написал регулярное выражение в режиме свободного интервала 1 , чтобы сделать его самодокументированным. Обычно это записывается следующим образом.
/^ *\| +total +\| +\K\d+(?:\.\d+)?(?=% +\| *$)/
Предположим, вы считываете свой файл в строке, содержащейся в переменной str
:
str =<<~END
===> Verifying dependencies...
===> Compiling sample
===> Performing cover analysis...
|------------------------|------------|
| module | coverage |
|------------------------|------------|
| sample_app | 12.94% |
| sample_sup | 56.78% |
| sample | 96% |
|------------------------|------------|
| total | 23.02% |
|------------------------|------------|
coverage calculated from:
/tmp/workspace/_build/test/cover/ct.coverdata
/tmp/workspace/_build/test/cover/eunit.coverdata
cover summary written to: /tmp/workspace/_build/test/cover/index.html
END
Тогда
str[r] #=> "23.02"
1 В режиме свободного интервала все пробелы удаляются перед анализом регулярного выражения, поэтому пробелы, являющиеся частью регулярного выражения, должны быть защищены. Я сделал это, поместив каждый пробел в класс символов, но вместо этого их можно было бы экранировать или использовать \s
(при необходимости).