Powershell正则表达式与“其他”正则表达式有什么不同?

时间:2017-07-05 13:54:25

标签: regex powershell

我有一个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中相同的行为:

http://regexstorm.net/tester

有人可以向我解释为什么匹配行为与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});

1 个答案:

答案 0 :(得分:3)

在Windows上,行结尾(通常)CRLF(两个字符,回车然后换行),而在基于unix的操作系统(基本上除了Windows之外的任何东西)上,它只是一个换行符{{ 1}}。转义序列LF指的是LF。要匹配CR,请使用\n

所以我认为,如果您的输入包含\r,那么CRLF将无法与之匹配。但是-\n会因为它跳过前面的\n

您用来测试它的网站可能会转换行结尾,或者没有正确保存它们,因此匹配,而.Net测试人员可能会相反。

作为参考,每当我需要匹配正则表达式中的行结尾时,我使用CR(可选的\r?\n后跟CR),这样我就可以捕获这两种类型的行结局。

因此,在您的示例中,您应该能够将正则表达式的开头从LF更改为---\n并使其正常工作,如果我对您的具体问题是正确的。