1

我正在尝试使用正则表达式解析模板格式。

这是一个示例

Type of Change:                 Modify
Metavance:                      None
AutoSys :                       None
Informatica Migration:          None
FTP Details:                    None
Device/Server:                  DWEIHPRD
DB Objects:                     Delete
                                 ARC_MEDICAL_CLAIM_DETAIL_FK1
DB Name:                        DWEIHPRD
Schema-Table(s):            UTIL
Interface(s):                     IF0515
Reports (RAPS):              None
Ancillary Systems:            None

基本上一切都是

字段:数据(可能是多行,如上面的 DB 对象示例)

^(.+?):(.*)

非常接近于做我想做的事,除了它只抓住了数据库对象的第一行。如果我打开 dotall,那么所有内容都会贪婪匹配,并且所有内容都在“第一个字段”结果中。

字段和数据中的最佳额外空白将被修剪,但如果它不作为正则表达式的一部分发生,那并不是什么大问题。

作为一个额外的麻烦,我必须在访问 97 vbscript 中完成这项工作,因此它可能无法使用一些更好的现代正则表达式功能:(

4

1 回答 1

0

注意:这是一个丑陋的解决方案,但也许它会帮助你。正如@anubhava 建议的那样,可能有一个非正则表达式的解决方案。我只是不太了解VBA,无法说出它可能是什么。

根据这篇文章,Microsoft Office 的 VBScript 支持前瞻、后瞻和非捕获(文章上的日期是 2009 年),但如果支持可以追溯到 Access 97,我会感到非常惊讶——尽管我可能是错的。

通常,我会为此使用前瞻和非捕获组,但避免使用它们,因为 Office 97 不太可能支持它们。所以请注意,您只需忽略捕获组 3(它仅用于测试可选多行匹配的行尾字符)。请注意,这只会找到传播两行的匹配项。

^(.+):\s+(.+)(\r\n\s+(.+))*
note this has four capture groups, but you will ignore \3. Use \1, \2, and \4 (four will be empty for single line matches)

解释:

^         # beginning of line
(.+):     # capture one or more characters up to a colon
\s+(.+)   # skip past whitespace, then capture characters up to end of line
(         # open a capturing group (to be thrown away. See explanation above)
  \r\n\s+ # peek ahead to see if there are EOL characters followed by whitespace
  (.+)    # if we got this far, capture whatever characters come after the whitespace
)*        # and make this group optional (and you will ignore it anyway)
于 2012-04-25T21:37:29.217 回答