Как использовать расширенную группировку регулярных выражений в groovy? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть команда sed, которая может извлечь число из отчета HTML о покрытии кода из Coverlet:

sed -rn 's/(<tr><th>Branch coverage:<\/th><td>([0-9]+.?[0-9]+)%<\/td><\/tr>)+/\2/p' /output/report/index.htm

Когда я пробую его в groovy, он не будет работать на \2 с

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/private/tmp/coverage.groovy: 19: Unexpected input: '\'; Expecting <EOF> @ line 19, column 81.
   0-9]+.?[0-9]+)%<\/td><\/tr>)+/\2/

Ошибка кода groovy:

def regex = /(<tr><th>Branch coverage:<\/th><td>([0-9]+.?[0-9]+)%<\/td><\/tr>)+/\2/

new File('/tmp/output/report/index.htm').eachLine { line ->
    if ((match = line =~ regex)) {
        println match
    }
}

Я не уверен, как избежать этого, я думаю?

1 Ответ

2 голосов
/ 22 апреля 2020

sed -rn 's/(<tr><th>Branch coverage:<\/th><td>([0-9]+.?[0-9]+)%<\/td><\/tr>)+/\2/p' /output/report/index.htm содержит команду замена с параметром -n и флаг p, которые оба используются для извлечения определенного значения из строки, используя sed.

В Groovy вы должны использовать , извлекая метод .find() напрямую и извлекать любую нужную группу из результата матча. Вот демоверсия:

String line = '<tr><th>Branch coverage:</th><td>15.50%</td></tr>'
def m = line =~ /(<tr><th>Branch coverage:<\/th><td>([0-9]+(?:\.[0-9]+)?)%<\/td><\/tr>)+/
if(m.find()) {         // If the first match is found
    println m[0][2]    // Show Group 2 value of the first match
} else {
    println 'No match' // Else, print No match
}

См. Groovy демо печать 15.50 в результате.

...