GUID格式:
由三十二位数字和字母组成。
{8位-4位-4位-4位-12位}
匹配表达式: \{[A-F0-9]{8}(-[A-F0-9]{4}){3}-[A-F0-9]{12}\}
问题:
假设存在一个这样的字符串
administrator登录窗口{C0869370-70BF-4408-A8CF-72A77BB1D788}第一次登陆{7618B0B2-D5A4-43b1-9055-65E744ACB044}<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
已知2个GUID,那么如何严格匹配整串字符呢?
匹配单个GUID值 >>> (\{C0869370-70BF-4408-A8CF-72A77BB1D788\})
匹配多个GUID值 >>> (.*?)(\{C0869370-70BF-4408-A8CF-72A77BB1D788\})(.*?)(\{7618B0B2-D5A4-43b1-9055-65E744ACB044\}) (1)
(.*?)的意义是匹配任意个字符任意次,并且该表达式执行最多一次。
改进:
当字符串出现变化时,(1)式就不能得到正确的匹配结果。如:
administrator登录窗口{{C0869370-70BF-4408-A8CF-72A77BB1D788}}第一次登陆{7618B0B2-D5A4-43b1-9055-65E744ACB044}成功{BCBBCE51-340E-434e-9CCB-0B8FAA020626}
那么需要修改为(.*?)(\{C0869370-70BF-4408-A8CF-72A77BB1D788\})(.*?)(\{7618B0B2-D5A4-43b1-9055-65E744ACB044\})$ (2)
$的意义为必须以该表达式结束。
总结:
对于字符串出现任意个GUID匹配模式:(.*?)(\{GUID\})一个或多个表达式$
缺陷:
对在前面出现其他的GUID字符串还没办法处理。如:
提示{BCBBCE51-340E-434e-9CCB-0B8FAA020626}administrator登录窗口{{C0869370-70BF-4408-A8CF-72A77BB1D788}}第一次登陆{7618B0B2-D5A4-43b1-9055-65E744ACB044}
注:
C#对正则匹配时默认是区分大小写的,所以上面的正则表达式要改为\{[A-Fa-f0-9]{8}(-[A-Fa-f0-9]{4}){3}-[A-Fa-f0-9]{12}\}
或是设置为RegexOptions.IgnoreCase。