我在日志文件中有这样的一行:
2015年4月24日00:13:22(通知)sudo:mailwall:TTY = unknown; PWD = / data / scanner / jobs / bmagent; USER = root; COMMAND = / usr / bin / yum -d 1 -c /data/yum/etc/yum.conf --get-desc --check-only install sms-appliance- release-10.5.2-3接受支持密码
我需要搜索以"accepted password for support"
结尾的行,并在这些行的开头返回时间戳,例如"2015 Apr 24 00:13:22"
我得到了这个正则表达式:
(\b.*)(?=\baccepted\b.\bpassword\b.\bfor\b.\bsupport\b)
返回整行。我只想要前20个字符(时间戳)。
如何更改正则表达式?
答案 0 :(得分:1)
尝试一个匹配的比赛开始并向前看:
^.{20}(?=.*accepted password for support$)
见l ive demo。
如果你不能使用预见,请尝试第1组:
^(.{20}).*accepted password for support$
答案 1 :(得分:1)
根据您在评论中提供的内容,在C#中,您根本不需要使用正则表达式来完成此任务。
var result2 = txt.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
.Where(p => p.Trim().EndsWith("accepted password for support") && p.Length > 19)
.FirstOrDefault().Substring(0, 20);
或者,正则表达式解决方案:
var txt = "\r\n2015 Apr 24 00:13:22 (notice) sudo: mailwall : TTY=unknown ; PWD=/data/scanner/jobs/bmagent ; USER=root ; COMMAND=/usr/bin/yum -d 1 -c /data/yum/etc/yum.conf --get-desc --check-only install sms-appliance-release-10.5.2-3 accepted password for support\r\nOne more line";
var rgx = new Regex(@"(?m)^\d{4}\s+\p{L}{3}\s+\d{1,2}\s+\d{2}(?::\d{2}){2}(?=.*?\baccepted\s+password\s+for\s+support\b)");
var result = rgx.Match(txt).Value;
实际上,@ Bohemian正则表达式also works,您只需指定RegexOptions.Multiline
标志,或在模式的开头使用(?m)
内联选项。
什么是 MULTILINE 选项?
此选项右侧的模式中的 (?m)
内联选项强制^
和$
与行的开头和结尾相匹配,而不是整个字符串。 (?m)
和RegexOptions.Multiline
的区别在于后者是针对整个模式设置的,并且可以为模式的一部分设置内联变体。