regex - 匹配语法问题

标签 regex xml powershell

我正在解析一个大型XML文件以查找某些内容,例如

$matches = [regex]::matches($content, '(<ac:structured-macro.+?ac:name="jira".+?</ac:structured-macro>)'

即返回以<ac:structured-macro>开头和结尾且带有“jira”的部分。

我发现的是也找到其他记录,例如

<ac:structured-macro blah blah </ac:structured-macro>
<ac:structured-macro blah ac:name="jira" blah </ac:structured-macro>

我希望它仅查找其中包含“jira”的那些。
  • 如果您找到“ac:structured-macro”结尾并且没有找到“jira”部分来重新开始搜索,该如何告诉我?
  • 找到这个后,我需要将零件放入该比赛中。 .+?(item1).+?(item2)是语法吗? (类似于C#)

  • 源样本:

    <ac:structured-macro ac:name="jira">
        <ac:parameter ac:name="columns">key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution</ac:parameter>
        <ac:parameter ac:name="server">JIRA (site.atlassian.net)</ac:parameter>
        <ac:parameter ac:name="serverId">72f475d9-a9b2</ac:parameter>
        <ac:parameter ac:name="jqlQuery">project = PLATFORM AND issuetype in (Bug, Question, Story) AND fixVersion = 1.12.1 AND component = &quot;UI Framework&quot;   </ac:parameter>
        <ac:parameter ac:name="maximumIssues">20</ac:parameter>
    </ac:structured-macro>
    

    最佳答案

    如评论中所述-不要对XML使用正则表达式!

    而是使用.NET的内置功能来解析它并使用它:

    $XmlDoc = [xml](Get-Content .\largefile.xml) 
    

    现在,$ XmlDoc变量包含一个实时的XmlDocument,我们可以通过编程方式检查和修改(使用XPath),而不仅仅是纯文本

    从您的简短摘录的内容中,我猜想这个大的xml文件是一个XSLT模板,其中包含用于Confluence的JIRA宏。

    由于Confluence使用 namespace 前缀ac-我们需要创建一个 namespace 管理器以便使用XPath查询文档:
    $XmlNSMgr = New-Object System.Xml.XmlNamespaceManager $XsltDoc.NameTable
    $XmlNSMgr.AddNamespace("xsl","http://www.w3.org/1999/XSL/Transform")
    $XmlNSMgr.AddNamespace("ac","http://www.atlassian.com/schema/confluence/4/ac/")
    

    现在,您可以使用SelectNodes()方法和XPath表达式选择所需的节点:
    $XPathExpression = '//ac:structured-macro'
    $MacroNodes = $XmlDoc.SelectNodes($XPathExpression, $XmlNSMgr)
    
    $MacroNodes现在是文档中找到的所有<ac:structured-macro>节点的集合。

    要仅选择存在ac:name="jira"属性的节点,请在XPath表达式中添加一个子句:
    $XPathExpression = '//ac:structured-macro[@ac:name = "jira"]'
    $JiraMacroNodes = $XmlDoc.SelectNodes($XPathExpression, $XmlNSMgr)
    

    您甚至可以编辑节点,并且保存编辑时文档将被修改:
    $JiraMacroNodes |ForEach-Object {
        $_.SetAttribute("attrName","newValue")
    }
    $XmlDoc.Save("C:\path\to\new.xslt")
    

    关于regex - 匹配语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32675746/

    相关文章:

    powershell - 自动执行需要用户输入的.cmd文件

    powershell - 使用 PSUseDeclaredVarsMoreThanAssignment 进行纠缠测试

    python - 拆分返回不匹配

    javascript - 匹配某个标点符号可以存在于正则表达式中的字符串内部或之后的字符串

    powershell - 使用PDFTK将PDF分成多页?

    xml - 使用 perl 的 SOAP 客户端 - WSDL URL 可用

    xml - 具有不同深度的 xml 文档的 xpath

    java - 是否可以在非捕获组上使用量词? - 正则表达式

    javascript - 不带前导零的整数相反的正则表达式

    java - Android:SQLite cursor.getPosition() 返回字符串?