正则表达式不匹配模式,只有单个部分

时间:2015-06-23 14:05:07

标签: regex powershell

我正在尝试搜索此表达式:

<main([\w\W]*)list-unstyled([\w\W]*)</main>

这个表达式在Sublime Text,Notepad ++ Etc中完美运行,完全符合我的要求。查看列表 - 无样式。

我的下面的脚本适用于:list-unstyled, <main, </main>, <main([\w\W]*), ([\w\W]*)</main>

但不是<main([\w\W]*)</main>,更不用说我真正想要的了,<main([\w\W]*)list-unstyled([\w\W]*)</main>,还是更好

<main([\w\W]*)$pattern([\w\W]*)</main>

如何才能使用该表达式?

到目前为止,这是我的代码:

param(
    [string]$pattern,
    [string]$path  
    )
Get-ChildItem -path $path -Recurse -Filter *.html | 
    Select-String $pattern | 
    Group-Object Path | 
    ForEach-Object{
        $props = @{
            File = $_.Group | Select-Object -First 1 -ExpandProperty Path
            PatternFound = ($_.Group | Select-Object -ExpandProperty LineNumber) -join ";"
        }

        New-Object -TypeName PSCustomObject -Property $props
    }

页面中的示例代码

<main class="col-md-9 col-md-push-3" property="mainContentOfPage" role="main">
<h1 property="name" id="wb-cont">Divulgation d’opérations à déclarer </h1>
<div class="wb-share text-right mrgn-tp-lg mrgn-bttm-lg"></div><h2>Le saviez-vous?</h2>
<p>Les opérations à déclarer doivent être divulguées à l’Agence du revenu du Canada (ARC).</p>
<h2>Qu’est-ce qu’une opération à déclarer?</h2>
<p>Il s’agit d’un type particulier d’évitement fiscal qui consiste en une opération menée seule, ou dans le cadre d’une série d’opérations, et visant à éviter de payer de l’impôt. Elle doit répondre à au moins deux des trois critères suivants&#160;:</p>
<ol>
    <li>Le promoteur ou le conseiller fiscal de l’opération a le droit de recevoir des honoraires qui sont fondés sur ce qui suit&#160;:
    <ol class="lst-lwr-alph">
        <li>le montant de l’avantage fiscal;</li>
        <li>l’obtention de l’avantage fiscal;</li>
        <li>le nombre de personnes qui prennent part à l’opération ou qui ont pu profiter des conseils du promoteur ou du conseiller fiscal au sujet des conséquences fiscales de l’opération.</li>
    </ol>
    </li>
    <li>Le promoteur ou le conseiller fiscal de l’opération obtient le «&#160;droit à la confidentialité&#160;», qui vous empêche de divulguer des renseignements sur les détails ou la structure de l’opération.</li>
    <li>Vous, la personne qui conclut l’opération en votre nom, le promoteur ou le conseiller fiscal se prévaut ou s’est prévalu d’une «&#160;protection contractuelle&#160;». Il s’agit de toute forme de protection contre l’échec de l’opération ou qui donne droit au paiement de dépenses (y compris d’impôt, de pénalités, d’intérêts ou d’un montant semblable) qui peuvent être engagées en cas de différend à l’égard de l’avantage fiscal.</li>
</ol>
<h2>Qui doit divulguer des opérations à déclarer?</h2>
<p>Si vous concluez une opération à déclarer pour vous‑mêmes ou au profit d’une autre personne, vous devez la divulguer. Les promoteurs et les conseillers fiscaux sont aussi tenus de le faire.</p>
<h2>Quel est le processus pour divulguer une opération à déclarer?</h2>
<p>Que vous soyez un particulier, une société, une fiducie ou une société de personnes, vous devez remplir une déclaration de renseignements et l’envoyer à l’Agence du revenu du Canada. Vous devez produire le <a href="/F/pbg/tf/rc312/">formulaire&#160;RC312, Déclaration de renseignements sur les opérations à déclarer</a>, au plus tard le&#160;30&#160;juin suivant l’année civile au cours de laquelle l’opération est devenue pour la première fois une opération à déclarer. Ce formulaire doit être produit séparément de votre déclaration de revenus et de toute autre déclaration de renseignements.</p>
<h2>Quelles sont les conséquences si on ne déclare pas une opération?</h2>
<ul class="list-unstyled">
    <li><strong>Pénalité&#160;:</strong> Si vous, ou votre représentant, ne produisez pas le formulaire&#160;RC312 dans le délai prévu, vous devrez, ainsi que chaque personne tenue de le produire, payer une pénalité, même s’il a eu entente sur qui devait le produire. Le montant de la pénalité est égal au montant total des honoraires à l’égard de l’opération que le promoteur ou le conseiller fiscal a le droit de recevoir.</li>
    <li><strong>Suspension de l’avantage fiscal :</strong> En plus de la pénalité, l’avantage fiscal est refusé jusqu’à ce que l’obligation de produire le formulaire&#160;RC312 soit satisfaite et que la pénalité et les intérêts cumulés soient payés.</li>
    <li><strong>Période de nouvelle cotisation prolongée :</strong> Si le formulaire&#160;RC312 n’a pas été produit dans le délai prévu, la période pendant laquelle l’ARC peut établir une nouvelle cotisation est prolongée de trois ans suivant la date où il a été produit.</li>
</ul>
<p>Pour en savoir plus, consultez le document d’information de&#160;2013 intitulé <a href="/nwsrm/fctshts/2013/m08/fs130830-fra.html">Nouvelles exigences en matière de déclaration&#160;: opérations à déclarer</a> ou le <a href="/F/pbg/tf/rc312/">formulaire RC312, Déclaration de renseignements sur les opérations à déclarer</a>.</p>
<p class="text-center">-30-</p>
<h2>Soyez branché</h2>
<p>Pour recevoir des mises à jour lorsque nous ajoutons de nouveaux renseignements à notre site Web, vous pouvez&#160;:</p>
<ul class="list-unstyled mrgn-lft-md">
    <li><img alt="" src="/images/scl-md/16px/twitter.gif" height="16" /> Suivre l'ARC sur Twitter - <a href="http://twitter.com/agencerevcan">@AgenceRevCan</a></li>
    <li><img alt="" src="/images/scl-md/16px/email.gif" height="16" /> Vous abonner à une <a href="/esrvc-srvce/mllst/sbscrb-fra.html">liste d'envois électroniques</a> de l'ARC</li>
    <li><img alt="" src="/images/scl-md/16px/rss.gif" height="16" /> Ajouter nos <a href="/esrvc-srvce/rss/menu-fra.html">fils RSS</a> &#224; votre lecteur de nouvelles</li>
</ul>
<p><img alt="" src="/images/scl-md/16px/youtube.gif" height="16" /> Vous pouvez également visiter notre <a href="http://www.youtube.com/agencerevcan">canal YouTube</a> pour voir des vidéos sur l'impôt.</p>
<p><a href="/nwsrm/md-fra.html">Renseignements aux médias</a></p>
<p><br />
<!-- InstanceEndEditable --></p>
<dl property="dateModified" id="wb-dtmd">
<dt>Date de modification :</dt>
<dd>
<time>2015-06-11</time>
</dd>
</dl>
</main>

谢谢!

2 个答案:

答案 0 :(得分:3)

就像每个人在评论和last question中建议的那样,如果可能的话,你应该使用html解析器。我没有最好的使用经验,因此我会尝试更新此代码以符合您的需求。

您遇到的主要问题是,当您将文件对象传递给Select-String时,它将以字符串数组读取而不是单个字符串。这两种方法都有其优点,但在您的情况下,这不是您想要的,因为您需要进行多行匹配。由于行号不重要,因此可以简化

param(
    [string]$pattern,
    [string]$path  
    )
Get-ChildItem -path $path -Recurse -Filter *.html | 
    Where-Object{
        Select-String -InputObject (Get-Content $_.FullName | Out-String) $pattern -Quiet
    }
}

这样做是使用Get-Content| Out-String的帮助下将整个文件作为一个字符串读取,然后我们使用你的正则表达式的略微调整版本。我们需要逃避反斜杠并添加几个修饰符。 </main>在下面的模式中变为<\/main>,并添加了(?sm)

(?sm)<main([\w\W]*)list-unstyled([\w\W]*)<\/main>

由于我们将-QuietSelect-String一起使用,我们只得到一个布尔结果。在Where-Object子句中使用它只允许匹配条件的fileinfo对象通过管道传递。这样,如果您不得不说..移动文件,您可以在Move-Item上添加,而无需另外foreach-object循环。

你有这个作为我会假设的剧本吗?如果要过滤此输出,则需要添加管道| Select Fullname | Export-CSV "C:\somepath"。无论是将此功能放入功能还是像script.ps1 pattern path | Select Fullname | Export-CSV "C:\somepath"这样使用它都取决于您。

答案 1 :(得分:1)

这是一个PS脚本,可以让您更接近您正在寻找的东西。根据您的情况调整逻辑。

$regex = [regex] '(?m)<main([\w\W]*)list-unstyled([\w\W]*)</main>'
get-childitem *.htm |
    foreach { $txt = type $_ ;
              $props = @{
                  status = $regex.Match($txt).Success;
                  path = $_
              } ;
              new-object -TypeName PSCustomObject -Property $props
    }


status path
------ ----
  True C:\Users\Les\testfile.htm
 False C:\Users\Les\testfile2.htm
 False C:\Users\Les\testfile3.htm