需要帮助增强Visual Studio宏

时间:2010-07-05 19:13:39

标签: regex visual-studio macros

这是我当前的宏

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

我需要做的是首先对行' <lastedit>Monday, July 05, 2010</lastedit>进行文件搜索(显然是作为REGEX,因为日期总是不同的)

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

然后我想要连接的是每次关闭文件时,Macro都会运行以更新编辑日期。

1 个答案:

答案 0 :(得分:1)

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

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

<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