REGEX匹配单行或多行

时间:2018-05-20 11:51:52

标签: regex powershell-v3.0 powershell-v4.0

使用降价文件,我会跟踪我的活动 到本周末,我需要制作一份关于我花在一个主题上的时间的报告。

我要做的是以下内容:

  1. 从MASTERFILE(参见https://pastebin.com/1Qs8f00M),生成我的活动的每日详细报告。
  2. 从这些每日报告(预期结果为https://pastebin.com/Pn56B3Fb)中,提取我的时间报告。
  3. 主文件:

    ## %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>的行结尾的行块。

    Multiline regex to match config block开始,我尝试了以下内容但迄今为止没有成功(我尝试找到一个灯塔或标记,因为我在我的.MD文件上使用PANDOC来生成.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 :(得分:0)

正则表达式的这些部分

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

匹配从第一个## %到最后一个<br>的所有内容,因为交替中的贪婪.*和单行修饰符((?s))。后者也会使点匹配换行符,因此^## %.*将匹配行行开头的## %以及之后的所有内容^-\s.*CHRG=将在行的开头匹配连字符和空格(实际上是任何空白字符),直到下一次出现CHRG=,即使有其他行以连字符开头和/之间的空间

尝试这样的事情:

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

从表达式中删除单行修饰符会使交替匹配仅在一行内(因为.不匹配换行符)。 [\s\S]*?然后对从行结束到下一个<br>(包括换行符)的所有内容进行非贪婪匹配。