寻找考虑字符串开头和结尾的模式

时间:2018-01-20 11:09:05

标签: regex xml powershell

目前我正在开发一个PowerShell脚本,用于查找由名为Help and Manual的创作工具创建的XML文件中的标记问题。

有时候,我遇到了一个我自己无法解决的问题。

让我们想象一下我们有一个字符串:

<para styleclass="Table Row Heading Text"><text style="font-size:12pt;">iso.outgoingQueueNameas</text></para>

我想要做的是创建一个与<text style="font-size:12pt;">.\*</text>匹配的正则表达式,前提是字符串在开始时有<para styleclass="Table Row Heading Text">,在结尾有</para>个结束标记。更糟糕的是,除了<text style="font-size:12pt;">.*</text>之外,<para>元素中可能有任何文字,如下所示:

<para styleclass="Table Row Heading Text">some text<text style="font-size:12pt;">iso.outgoingQueueNameas</text>some text</para>

我知道我可以做一些初步检查,以确定一个字符串是以<para styleclass="Table Row Heading Text">开头还是以<para>结尾,然后使用一个相对简单的正则表达式得到我想要的,但是我我真的很感兴趣,如果它只能通过使用正则表达式来完成。

3 个答案:

答案 0 :(得分:1)

不幸的是,你问的是如何用锤子拧入灯泡。您可能能够用锤子完成工作,但更可能的是灯泡最终会破碎。你应该问一下更换灯泡有哪些更好的工具。

/隐喻

您可能应该使用XPathDocument和XPathExpression来测试此XML片段以查找您正在寻找的条件。

我把你和一些类似元素共享的片段扔到文件xpathfragment.xml中:

<?xml version="1.0"?><xml>
<para styleclass="NOT Table Row Heading Text">some text<text style="font-size:12pt;">iso.otherstuffthings</text>other text></para>
<para styleclass="Table Row Heading Text">some text<text style="font-size:12pt;">iso.outgoingQueueNameas</text>some text</para>
<para styleclass="Table Row Heading Text">some text<text style="font-size:18pt;">iso.outgoingQueueNameas</text>some text</para>
</xml>

以下PowerShell脚本执行我认为您尝试执行的操作:

找到<text>元素的内部文本,其'style'属性等于'font-size:12pt',其直接父级是<para>元素,'styleclass'相等到'表行标题文字'

$filename = "c:\users\Username\Documents\xpathfragment.xml"
$xpDoc = [System.Xml.XPath.XPathDocument] $filename
$xpDocNavigator = $xpDoc.CreateNavigator()
$xpPathExpression = "/xml/para[@styleclass='Table Row Heading Text']/text[@style='font-size:12pt;']"

$xpDocNavigator.Evaluate($xpPathExpression)

这将从测试xml中返回单个结果:

Value            : iso.outgoingQueueNameas
NodeType         : Element
LocalName        : text
NamespaceURI     : 
Name             : text
Prefix           : 
BaseURI          : file:///c:/users/Username/Documents/xpathfragment.xml
IsEmptyElement   : False
NameTable        : System.Xml.NameTable
HasAttributes    : True
HasChildren      : True
UnderlyingObject : iso.outgoingQueueNameas
LineNumber       : 3
LinePosition     : 53
IsNode           : True
XmlType          : 
TypedValue       : iso.outgoingQueueNameas
ValueType        : System.String
ValueAsBoolean   : 
ValueAsDateTime  : 
ValueAsDouble    : 
ValueAsInt       : 
ValueAsLong      : 
XmlLang          : 
SchemaInfo       : 
CanEdit          : False
OuterXml         : <text style="font-size:12pt;">iso.outgoingQueueNameas</text>
InnerXml         : iso.outgoingQueueNameas

我认为,值属性iso.outgoingQueueNameas是您想要找到的内容。

您需要将xpath查询设计为在您正在使用的xml文档的上下文中工作,但上述内容应足以让您入门。你将学习一些学习曲线来获取xpath语法,但最后你会理解一个更适合xml搜索的工具。

答案 1 :(得分:0)

使用正则表达式解析XML容易出错,并且将来会给您带来问题。使用XML解析器解析器或根据模式验证它,比如DTD / XSD

答案 2 :(得分:0)

尝试使用the following regex,然后使用this answer

提取捕获组
(?<=^<para styleclass="Table Row Heading Text">)(?:[^<]*)(<.*)(?=<\/para>)

它将捕获<<para styleclass="Table Row Heading Text">之后的第一个</para>之间的所有文字(不包括这些“边缘”)。

示例输入:

<para styleclass="Table Row Heading Text">some text<text style="font-size:12pt;">iso.outgoingQueueNameas</text><text style="font-size:12pt;">iso.outgoingQueueNameas</text></para>

捕获示例:

<text style="font-size:12pt;">iso.outgoingQueueNameas</text><text style="font-size:12pt;">iso.outgoingQueueNameas</text>