我写的正则表达式是
<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>
标签。
有人可以帮助我吗?
答案 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>
子字符串