当 regex101 匹配时,RegEx C# 不匹配

Posted

技术标签:

【中文标题】当 regex101 匹配时,RegEx C# 不匹配【英文标题】:RegEx C# doesnt Match when regex101 does 【发布时间】:2018-08-12 20:43:50 【问题描述】:

这是我的模式:

-8\s+((?:[0-9]2\/[0-9]2\/[0-9]2)\s+(?:[0-9]2:[0-9]2:[0-9]2))\s+(?:LINE)\s+=\s+([0-9]0,9)\s+(?:STN)\s+=\s+([0-9]0,9)[ ]*(?:\n[ \S]*)*INCOMING CALL(?:[\S\s][^-])*

这是我的字符串:

--------   02/16/18   13:50:39   LINE = 0248   STN = 629     
       CALLING NUMBER   252
       NAME             Mar Ant
       UNKNOWN
       DNIS NUMBER      255
       BC = SPEECH
       VOIP CALL
00:00:00   INCOMING CALL    RINGING 0:09
       LINE = 0004
00:00:25   CALL RELEASED

它确实与几个在线正则表达式测试器匹配,但与 http://regexstorm.net/tester 等 C# 测试器不匹配,因为

.NET 不使用 Posix 语法

我注意到如果我删除了模式的最后一部分

INCOMING CALL(?:[\S\s][^-])*

它确实匹配,但仍然不正确,或者至少不是我所期望的。

我应该改变什么来使这个模式匹配字符串?

【问题讨论】:

我的字符串末尾有一个新行 (\n),我显然看不到。通过在验证之前修剪输入来解决它。 【参考方案1】:

该问题与模式类型无关,该模式实际上不符合 POSIX,因为正则表达式转义不能在括号表达式中使用(请参阅您的模式中的[\S\s],可以写成. 和@987654324 @ 选项,或 (?s:.))。

您只需将\n 替换为\r?\n(?:\r\n?|\n) 以匹配Windows 换行样式。

使用

-8\s+((?:[0-9]2/[0-9]2/[0-9]2)\s+(?:[0-9]2:[0-9]2:[0-9]2))\s+(?:LINE)\s+=\s+([0-9]0,9)\s+(?:STN)\s+=\s+([0-9]0,9)[ ]*(?:\r?\n[ \S]*)*INCOMING CALL(?:[\S\s][^-])*

见this regex demo。

【讨论】:

以上是关于当 regex101 匹配时,RegEx C# 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

RegEx - 匹配以冒号开头的子字符串

C# 为啥我的 RegEx 不匹配?这个真的很简单

模式在regex101上运行但不适用于Google脚本[重复]

Regex.Replace 替换空匹配

C# Regex.Replace 匹配相同数量的字符

如何在 C# 中与 Regex Class 匹配我部分知道的字符串?