代码之家  ›  专栏  ›  技术社区  ›  Md. Abdul Alim

正则表达式匹配特定标记

  •  1
  • Md. Abdul Alim  · 技术社区  · 7 年前

    我写了一个正则表达式

    <w:p.*>\[.*content.*\].*</w:p>
    

    它工作得很好。但有时会匹配不需要的标签。

    我从字处理中找到了一个字符串,比如

    <w:p w:rsidR=‘00E52FD7’ w:rsidRDefault=‘00341592’ w:rsidP=‘000307E7’><w:pPr><w:pStyle w:val=‘Heading1’/><w:contextualSpacing w:val=‘0’/><w:jc w:val=‘center’/></w:pPr><w:r><w:rPr><w:noProof/></w:rPr><w:drawing><wp:inline distT=‘0’ distB=‘0’ distL=‘0’ distR=‘0’ wp14:anchorId=‘4F64B28D’ wp14:editId=‘6522B16C’><wp:extent cx=‘1358306’ cy=‘1343025’/><wp:effectExtent l=‘0’ t=‘0’ r=‘0’ b=‘0’/><wp:docPr id=‘2’ name=‘Picture 2’ descr=‘N:\HUMAN RESOURCES\Logos\Rancho-Logo-Type-Black.png’/><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a=‘http://schemas.openxmlformats.org/drawingml/2006/main’ noChangeAspect=‘1’/></wp:cNvGraphicFramePr><a:graphic xmlns:a=‘http://schemas.openxmlformats.org/drawingml/2006/main’><a:graphicData uri=‘http://schemas.openxmlformats.org/drawingml/2006/picture’><pic:pic xmlns:pic=‘http://schemas.openxmlformats.org/drawingml/2006/picture’><pic:nvPicPr><pic:cNvPr id=‘0’ name=‘Picture 1’ descr=‘N:\HUMAN RESOURCES\Logos\Rancho-Logo-Type-Black.png’/><pic:cNvPicPr><a:picLocks noChangeAspect=‘1’ noChangeArrowheads=‘1’/></pic:cNvPicPr></pic:nvPicPr><pic:blipFill><a:blip r:embed=‘rId7’ cstate=‘print’><a:extLst><a:ext uri=‘{28A0092B-C50C-407E-A947-70E740481C1C}’><a14:useLocalDpi xmlns:a14=‘http://schemas.microsoft.com/office/drawing/2010/main’ val=‘0’/></a:ext></a:extLst></a:blip><a:srcRect/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr bwMode=‘auto’><a:xfrm><a:off x=‘0’ y=‘0’/><a:ext cx=‘1374505’ cy=‘1359042’/></a:xfrm><a:prstGeom prst=‘rect’><a:avLst/></a:prstGeom><a:noFill/><a:ln><a:noFill/></a:ln></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p><w:p w:rsidR=‘00341592’ w:rsidRPr=‘00341592’ w:rsidRDefault=‘002F27D8’ w:rsidP=‘00341592’><w:pPr><w:pStyle w:val=‘Subtitle’/><w:contextualSpacing w:val=‘0’/><w:rPr><w:sz w:val=‘36’/><w:szCs w:val=‘36’/></w:rPr></w:pPr><w:r><w:t xml:space=‘preserve’>Job Description: </w:t></w:r><w:r w:rsidR=‘00360E41’><w:t>Irrigation/</w:t></w:r><w:r w:rsidR=‘004A20D0’><w:t>Maintenance Worker</w:t></w:r></w:p><w:p w:rsidR=‘000307E7’ w:rsidRDefault=‘000307E7’ w:rsidP=‘000307E7’><w:pPr><w:pStyle w:val=‘Normal1’/></w:pPr><w:bookmarkStart w:id=‘0’ w:name=‘h.17ary2u5jp34’ w:colFirst=‘0’ w:colLast=‘0’/><w:bookmarkEnd w:id=‘0’/></w:p><w:p w:rsidR=‘00007B19’ w:rsidRDefault=‘00007B19’ w:rsidP=‘00341592’><w:pPr><w:pStyle w:val=‘Normal1’/></w:pPr></w:p><w:p w:rsidR=‘00533338’ w:rsidRDefault=‘000307E7’ w:rsidP=‘00341592’><w:pPr><w:pStyle w:val=‘Normal1’/></w:pPr><w:r><w:t xml:space=‘preserve’>Rancho has reviewed the duties described within this job description to ensure that essential functions and basic duties are included.  It is not designed to cover or contain a comprehensive listing of activities, duties or responsibilities required of an incumbent.  An incumbent may be asked to perform other duties as required or assigned by their supervisor.  </w:t></w:r></w:p><w:p w:rsidR=‘00533338’ w:rsidRDefault=‘00533338’ w:rsidP=‘00341592’><w:pPr><w:pStyle w:val=‘Normal1’/></w:pPr></w:p><w:p w:rsidR=‘00710D42’ w:rsidRDefault=‘00710D42’ w:rsidP=‘00341592’><w:pPr><w:pStyle w:val=‘Normal1’/></w:pPr></w:p><w:p w:rsidR=‘004618DB’ w:rsidRDefault=‘004618DB’ w:rsidP=‘004618DB’><w:pPr><w:pStyle w:val=‘Normal1’/></w:pPr><w:r><w:t>[</w:t></w:r><w:proofErr w:type=‘gramStart’/><w:r><w:t>content</w:t></w:r><w:proofErr w:type=‘gramEnd’/><w:r><w:t>]</w:t></w:r></w:p>
    

    我的要求是选择 <w:p> 标签包含

    [内容]

    但这个表达式与其他表达式匹配 <W:P> 不包含所需文本的标记。

    有人能帮我吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    如果要处理XML文件,建议使用XML解析器。如果您只有这个简短的片段,并且需要它来执行一次性任务,那么您可以使用这两种regex方法中的任何一种。

    提取所需的所有匹配项并检查其中包含 [content] ,只返回该子字符串 :

    Regex.Matches(s, @"(?s)<w:p\b[^>]*>(.*?)</w:p>")
        .Cast<Match>()
        .Where(x => x.Groups[1].Value.Contains("[content]"))
        .Select(z => z.Value);
    

    注意,在这里, (?s)<w:p\b[^>]*>(.*?)</w:p> 比赛 <w:p ,然后断言右边没有单词char, \b 单词边界,然后通过使用除 > 然后 > ,然后它将尽可能少的任何0+字符捕获到组1中。( x.Groups[1].Value )最后匹配 </w:p> . 这个 .Where(x => x.Groups[1].Value.Contains("[content]")) 条件只保留那些包含 [内容] w:p 元素。

    使用一个更复杂的regex和一个回火贪婪的令牌:

    (?s)<w:p\b[^>]*>(?:(?!<w:p\b).)*?\[content].*?</w:p>
    

    细节

    • (?s) -A RegexOptions.Singleline 内联选项
    • <W: P -A <W: P 子串
    • \b 字边界
    • [^>]* -0+个字符,而不是 >
    • > -A >
    • (?:(?!<w:p\b).)*? -任何字符,0+次,但尽可能少,这不是 <W: P 后跟一个单词边界序列
    • \[content] -A [内容] 子串
    • .*? -任何0+字符,尽可能少
    • </W:P & GT; -文字 </W:P & GT; 子串