我有一个PowerShell脚本来匹配以下正则表达式:
---\n(0[1-9]|1[0-2][\/](0[1-9]|[12]\d|3[01])[\/]\d{2}[\s\S]+?)-----
要匹配的字符串是以下日志文件片段:
------------------------------------------------------------------------------- 10/26/16 11:41:26 - Process(15925376.4) User(mqm) Program(amqzmuc0) Host(aixmq1) Installation(Installation1) VRMF(8.0.0.4) QMgr(ecs.queue.manager) AMQ6287: WebSphere MQ V8.0.0.4 (p800-004-151017). EXPLANATION: WebSphere MQ system information: Host Info :- AIX 7.1 (MQ AIX 64-bit) Installation :- /usr/mqm (Installation1) Version :- 8.0.0.4 (p800-004-151017) ACTION: None. ------------------------------------------------------------------------------- 10/26/16 11:41:26 - Process(15925376.4) User(mqm) Program(amqzmuc0) Host(aixmq1) Installation(Installation1) VRMF(8.0.0.4) QMgr(ecs.queue.manager) AMQ6287: WebSphere MQ V8.0.0.4 (p800-004-151017). EXPLANATION:FFF WebSphere MQ system information: Host Info :- AIX 7.1 (MQ AIX 64-bit) Installation :- /usr/mqm (Installation1) Version :- 8.0.0.4 (p800-004-151017) ACTION: None. -------------------------------------------------------------------------------
在perl和regexr.com上使用此正则表达式,它完全匹配该日志文件片段中的两个部分。
现在我在powershell中实现了相同的正则表达式,除非我删除\ n之前的缺点,否则它不会返回任何匹配项。如果我用一个只包含减号的匹配组替换这些缺点,那么它也会起作用。
为了保持一致性和理解正在发生的事情,我需要理解为什么匹配行为在powershell中如此不同。一旦开始有弊端,为什么不匹配?
以下.NET正则表达式测试程序显示与powershell中相同的行为:
有人可以向我解释为什么匹配行为与powersl / regexr.com相比在powershell中有所不同吗?
这是我目前用来匹配该正则表达式的powershell代码片段:
$matches = ([regex]::matches($sInput, "---\n(0[1-9]|1[0-2][\/](0[1-9]|[12]\d|3[01])[\/]\d{2}[\s\S]+?)\n-") | %{$_.value});
答案 0 :(得分:3)
在Windows上,行结尾(通常)CRLF
(两个字符,回车然后换行),而在基于unix的操作系统(基本上除了Windows之外的任何东西)上,它只是一个换行符{{ 1}}。转义序列LF
指的是LF。要匹配CR,请使用\n
。
所以我认为,如果您的输入包含\r
,那么CRLF
将无法与之匹配。但是-\n
会因为它跳过前面的\n
。
您用来测试它的网站可能会转换行结尾,或者没有正确保存它们,因此匹配,而.Net测试人员可能会相反。
作为参考,每当我需要匹配正则表达式中的行结尾时,我使用CR
(可选的\r?\n
后跟CR
),这样我就可以捕获这两种类型的行结局。
因此,在您的示例中,您应该能够将正则表达式的开头从LF
更改为---\n
并使其正常工作,如果我对您的具体问题是正确的。