正则表达式匹配特定标签

时间:2018-12-06 06:54:00

标签: c# regex

我写的正则表达式是

<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 个答案:

答案 0 :(得分:1)

如果要处理XML文件,建议使用XML解析器。如果只有这个简短的片段,并且需要它来执行一次性任务,则可以使用两种正则表达式方法之一。

提取所需的所有匹配项,并检查其中包含[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来匹配其余元素+ >以外的其他字符,然后是>,则它将捕获的0+个字符(尽可能少)捕获到组1(x.Groups[1].Value)中,最后匹配</w:p>.Where(x => x.Groups[1].Value.Contains("[content]"))条件仅将包含[content]的那些保留在w:p元素的内部XML部分中。

使用带有脾气暴躁的令牌的更复杂的正则表达式:

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

详细信息

  • (?s)-一个RegexOptions.Singleline内联选项
  • <w:p-一个<w:p子字符串
  • \b-单词边界
  • [^>]*-除>以外的0多个字符
  • >-一个>
  • (?:(?!<w:p\b).)*?-0次以上的任意字符,但应尽可能少,这不是<w:p的起点,其后是单词边界序列
  • \[content]-一个[content]子字符串
  • .*?-任意0个以上的字符,尽可能少
  • </w:p>-文字</w:p>子字符串