我正在尝试从字符串的开头到具有转义序列"\r\n\r\n"
的点的子字符串,我的正则表达式是Regex completeCall = new Regex(@"^.+?\r\n\r\n", RegexOptions.Compiled);
只要你只有像{{{{}}这样的字符串就可以很好地工作但是,一旦你有了模式123\r\n\r\n
,模式就不再匹配了。
关于我做错了什么建议?
123\r\n 456\r\n\r\n
此处编辑是导致其失败的数据(\ r \ n翻译为实际换行符)
Regex completeCall = new Regex(@"^.+?\r\n\r\n", RegexOptions.Compiled);
Regex junkLine = new Regex(@"^\D", RegexOptions.Compiled);
private void ClientThread()
{
StringBuilder stringBuffer = new StringBuilder();
(...)
while(true)
{
(...)
Match match = completeCall.Match(stringBuffer.ToString());
while (Match.Success) //once stringBuffer has somthing like "123\r\n 456\r\n\r\n" Match.Success always returns false.
{
if (junkLine.IsMatch(match.Value))
{
(...)
}
else
{
(...)
}
stringBuffer.Remove(0, match.Length); // remove the processed string
match = completeCall.Match(stringBuffer.ToString()); // check to see if more than 1 call happened while the thread was sleeping.
}
Thread.Sleep(1000);
}
答案 0 :(得分:1)
正则表达式中的.
与换行符不匹配。您需要指定RegexOptions.Singleline
选项来解决此问题。
不知何故,我认为vfilby真的意味着这个选择。 =)
答案 1 :(得分:0)
模式^.+?\r\n\r\n
与字符串123\r\n\r\n
匹配,因为123
不包含换行符(默认情况下,.
与.NET中的\n
不匹配) 。要让您的模式也匹配123\r\n 456\r\n\r\n
,请启用DOT-ALL选项:
`(?s)^.+?\r\n\r\n`