这是我的模式:
-{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
它确实与几个在线正则表达式测试人员匹配,但与cazxswpoi等C#测试人员不匹配
.NET不使用Posix语法
我注意到,如果我删除模式的最后一部分
http://regexstorm.net/tester
它确实匹配但仍然不正确或至少不是我对它的期望。
我应该改变什么使这个模式匹配字符串?
问题与模式类型无关,模式实际上不符合POSIX,因为正则表达式转义符不能在括号表达式中使用(请参见模式中的INCOMING CALL(?:[\S\s][^-])*
,可以与[\S\s]
选项一起写为.
,或者作为RegexOptions.Singleline
)。
你需要做的就是用(?s:.)
或\n
替换\r?\n
以匹配Windows换行符风格。
使用
(?:\r\n?|\n)
见-{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][^-])*
。