这是我当前的宏
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都会运行以更新编辑日期。
答案 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