【问题标题】:Need help enhancing a Visual Studio Macro需要帮助增强 Visual Studio 宏
【发布时间】:2010-07-05 19:13:39
【问题描述】:

这是我当前的宏

Public Module CopyrightCode
    Sub AddCopyrightHeader()

        Dim doc As Document
        Dim docName As String
        Dim companyName As String = "Urban Now"
        Dim authorName As String = "Chase Florell"
        Dim authorEmail As String = "chase@infinitas.ws"
        Dim copyrightText As String = "'     All code is Copyright © " & vbCrLf & _
        "'      -   Urban Now (http://mysite.com)" & vbCrLf & _
        "'      -   Infinitas Advantage (http://infinitas.ws)" & vbCrLf & _
        "'     All Rights Reserved"

        ' Get the name of this object from the file name
        doc = DTE.ActiveDocument

        ' Get the name of the current document
        docName = doc.Name

        ' Set selection to top of document
        DTE.ActiveDocument.Selection.StartOfDocument()
        DTE.ActiveDocument.Selection.NewLine()

        Dim sb As New StringBuilder
        sb.Append("' --------------------------------")
        sb.Append(vbCrLf)
        sb.Append("' <copyright file='" & docName & "' company='" & companyName & "'>")
        sb.Append(vbCrLf)
        sb.Append(copyrightText)
        sb.Append(vbCrLf)
        sb.Append("' </copyright>")
        sb.Append(vbCrLf)
        sb.Append("' <author>" & authorName & "</author>")
        sb.Append(vbCrLf)
        sb.Append("' <email>" & authorEmail & "</email>")
        sb.Append(vbCrLf)
        sb.Append("' <lastedit>" & FormatDateTime(Date.Now, vbLongDate) & "</lastedit>")
        sb.Append(vbCrLf)
        sb.Append("' ---------------------------------")

        ' Write first line
        DTE.ActiveDocument.Selection.LineUp()
        DTE.ActiveDocument.Selection.Text = sb.ToString

    End Sub
End Module

我需要做的是首先对' &lt;lastedit&gt;Monday, July 05, 2010&lt;/lastedit&gt; 行进行文件搜索(显然是作为正则表达式,因为日期总是不同的)

如果存在,将日期替换为今天的日期,如果它没有运行完整的插入。

然后我想挂钩的是每次关闭文件时,宏都会运行以更新编辑日期。

【问题讨论】:

    标签: regex visual-studio macros


    【解决方案1】:

    我不确定你在做什么,但如果那是 XML(看起来像),你应该使用 XQuery 或其他任何东西来定位/更新 lastedit 节点,因为这将处理各种复杂性cmets 和嵌套等等。

    如果您对输入文本的内容有信心并且确定其中没有任何内容,则可以快速而肮脏地匹配特定的日期格式:

    <lastedit>\w{6,9}, \w{3,9} \d\d, \d{4}</lastedit>
    

    或者,更快更脏:

    <lastedit>[^<]+<lastedit>
    


    这取决于您的需求是什么,您对文件内容的信心程度等等。


    哦。所以我很好奇,就去看看 Visual Studio 是如何实际处理正则表达式的,嗯……whoever did the VS regex needs to be whacked round the head

    将上述标准正则表达式翻译成 VS 正则表达式,得到:

    \<lastedit\>:i+, :i+ :d:d, :d:d:d:d\</lastedit\>
    

    \<lastedit\>[^<]+</lastedit\>
    

    也许吧。 the documentation 很难阅读,因为微软似乎不想编写在现代浏览器中运行的网站。

    当然,假设宏使用这个疯狂的正则表达式而不是普通的 .NET 正则表达式 - 如果是后者,那么上面的东西就可以了,你可以忽略这种疯狂。 :)


    要实施,请尝试以下操作:

    Dim reLastEdit As Regex = New Regex("<lastedit>[^<]+<lastedit>")
    
    Dim matches AS MatchCollection = reLastEdit.Matches(Input)
    
    If matches.Count > 0
    Then
        ' Change Header
        Dim NewLastEdit As String = "<lastedit>" & FormatDateTime(Date.Now, vbLongDate) & "</lastedit>"
        reLastEdit.Replace(Input,NewLastEdit)
    Else
        ' Add Header
    EndIf
    

    或类似的。信息在这里:http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex_methods.aspx

    【讨论】:

    • 我正在做的是自动将版权标题添加到我的所有代码文件中。但是如果标头已经存在,我们只想将lastedit 更新为当前日期,而不是再次插入整个标头。
    • 谢谢。我同意,该文档在 FF 中不可读。我认为我可以处理的正则表达式部分,我面临的挑战是将它实施到宏中。 1)读取文件的第 11 行 2)如果存在 - 更新日期 - 否则 - 添加标题。
    • 我发现一些建议宏使用常规 .NET 的东西,所以我把一些东西放在一起 - 但我不做 VB,所以它可能不完全正确。不过,此处的示例和方法部分可能会有所帮助:msdn.microsoft.com/en-us/library/…
    • 感谢您研究它...我会破解并发布我的结果。谢谢。