【问题标题】:RegEx C# doesnt Match when regex101 does当 regex101 匹配时,RegEx C# 不匹配
【发布时间】: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),我显然看不到。通过在验证之前修剪输入来解决它。

标签: c# regex string match


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多