这是我的模式:
-{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][^-])*
它匹配但仍然不正确或至少不是我对它的期望。
我应该更改以使此模式与字符串匹配?
答案 0 :(得分:1)
问题与模式类型无关,模式实际上不符合POSIX,因为正则表达式转义符不能在括号表达式中使用(请参阅模式中的[\S\s]
,可以写为.
与RegexOptions.Singleline
选项一起使用,或(?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。