REGEX соответствует одной строке или многострочному - PullRequest
0 голосов
/ 20 мая 2018

Используя файл уценки, я отслеживаю свою активность.
К концу недели мне нужно составить отчет о том, сколько времени я потратил на тему.

Что я пытаюсьсделать следующее:

  1. Из MASTERFILE (см. https://pastebin.com/1Qs8f00M), создать ежедневный и подробный отчет о моей деятельности.
  2. Из этих ежедневных отчетов (ожидаемый результат будетбыть https://pastebin.com/Pn56B3Fb), извлечь мой отчет о времени.

MASTERFILE:

## %XXX ProjectName1
<br>

- XXX : Restabat ut Caesar post haec properaret accitus et ...
- XXX : fictisque blanditiis hortabatur...
```
$ various_commands or reminder
```

- XXX : Restabat ut Caesar post haec properaret accitus et abstergendae causa suspicionis sororem suam, eius uxorem, quid moliretur haerebat. : CHRG=0.5
```
Novo denique perniciosoque exemplo idem Gallus ausus est inire flagitium grave, quod Romae cum ultimo dedecore temptasse aliquando dicitur Gallienus, et adhibitis paucis clam ferro succinctis vesperi per tabernas palabatur et conpita quaeritando Graeco sermone, cuius erat inpendio gnarus, quid de Caesare quisque sentiret. 

Sed ut tum ad senem senex de senectute, sic hoc libro ad amicum amicissimus scripsi de amicitia. Tum est Cato locutus, quo erat nemo fere senior temporibus illis, nemo prudentior; nunc Laelius et sapiens (sic enim est     habitus) et amicitiae gloria excellens de amicitia loquetur. 
```
<br>

## %YYY ProjectName2
<br>

- YYY : Restabat ut Caesar post haec properaret accitus et : CHRG=0.25
<br>

Последнее легко, поскольку мои задачи структурированы:

- [ProjectCode] : some details : CHRG=0,5

Следующее работает довольно хорошо:

Get-Content -Raw .\test.md |
    Select-String '(-.*CHRG=.*)' -AllMatches |
    Foreach {$_.Matches} |
    Foreach {$_.Value}

Первое сложнее: я не могу понять правильное регулярное выражение для

  • строк соответствия, таких как ## %XXX ProjectName1 и
  • сопоставить блок строк, начинающийся со строки, содержащей CHRG= и заканчивающийся строками, содержащими <br>.

С Многострочное регулярное выражение для соответствия блоку конфигурации ,До сих пор я безуспешно пробовал следующее (я пытался найти маяк или маркер полезными, так как я использую PANDOC в моих файлах .MDсоздавать файлы .HTML;две птицы одним камнем):

Get-Content -Raw .\test.md |
    Select-String '(?smi)(^## %.*|^-\s.*CHRG=.*).*?<br>' -AllMatches |
    Foreach {$_.Matches} |
    Foreach {$_.Value}

Желаемый результат будет:

## %XXX ProjectName1
<br>

- XXX : Restabat ut Caesar post haec properaret accitus et abstergendae causa suspicionis sororem suam, eius uxore m, quid moliretur haerebat. : CHRG=0.5
<code>
Novo denique perniciosoque exemplo idem Gallus ausus est inire flagitium grave, quod Romae cum ultimo dedecore tem ptasse aliquando dicitur Gallienus, et adhibitis paucis clam ferro succinctis vesperi per tabernas palabatur et conpita quaeritando Graeco sermone, cuius erat inpendio gnarus, quid de Caesare quisque sentiret.

Sed ut tum ad senem senex de senectute, sic hoc libro ad amicum amicissimus scripsi de amicitia. Tum est Cato locutus, quo erat nemo fere senior temporibus illis, nemo prudentior; nunc Laelius et sapiens (sic enim est habitus) et amicitiae gloria excellens de amicitia loquetur.
</code>
<br>

## %YYY ProjectName2
<br>

- YYY : Restabat ut Caesar post haec properaret accitus et : CHRG=0.25
<br>

Фактический результат:

## %XXX ProjectName1
<br>

- XXX : Restabat ut Caesar post haec properaret accitus et ...
- XXX : fictisque blanditiis hortabatur...
<code>
$ various_commands or reminder
</code>

- XXX : Restabat ut Caesar post haec properaret accitus et abstergendae causa suspicionis sororem suam, eius uxorem, quid moliretur haerebat. : CHRG=0.5
<code>
Novo denique perniciosoque exemplo idem Gallus ausus est inire flagitium grave, quod Romae cum ultimo dedecore temptasse aliquando dicitur Gallienus, et adhibitis paucis clam ferro succinctis vesperi per tabernas palabatur et conpita quaeritando Graeco sermone, cuius erat inpendio gnarus, quid de Caesare quisque sentiret.

Sed ut tum ad senem senex de senectute, sic hoc libro ad amicum amicissimus scripsi de amicitia. Tum est Cato locutus, quo erat nemo fere senior temporibus illis, nemo prudentior; nunc Laelius et sapiens (sic enim est habitus) et amicitiae gloria excellens de amicitia loquetur.
</code>
<br>

## %YYY ProjectName2
<br>

- YYY : Restabat ut Caesar post haec properaret accitus et : CHRG=0.25
<br>

1 Ответ

0 голосов
/ 21 мая 2018

Эти части вашего регулярного выражения

(^## %.*|^-\s.*CHRG=.*).*?<br>
 ~~~~~~~               ~~~~~~~

соответствуют всему от первого ## % до последнего <br> из-за жадного .* в чередовании и однострочного модификатора ((?s)).Последнее также приводит к совпадению точек с новыми строками, поэтому ^## %.* будет соответствовать ## % в начале строки и всем последующим .^-\s.*CHRG= будет соответствовать дефису и пробелу (ну, фактически, любому символу пробела) в начале строки до следующего вхождения CHRG=, , даже если есть другие строки, начинающиеся с дефиса и пробела между.

Попробуйте что-то вроде этого:

(?mi)^(## %.*|-\s.*CHRG=.*)[\s\S]*?<br>

Удаление однострочного модификатора из выражения делает совпадение чередования только внутри строки (потому что . не будет совпадатьстроки).Затем [\s\S]*? выполняет не жадное сопоставление всего от конца строки до следующего <br> (включая переводы строки).

...