0

这是我的字符串

REGISTER sip:192.168.178.1 SIP/2.0
Call-ID: bla@192.168.178.60
CSeq: 1441 REGISTER
From: "620" <sip:620@192.168.178.20>;tag=bla
To: "620" <sip:620@192.168.178.20>
Via: SIP/2.0UDP 192.168.178.60:59488;branch=bla;rport
Max-Forwards: 70
User-Agent: bla
Contact: *
Expires: 0
Content-Length: 0

所以这个字符串有几个换行符。我的正则表达式是这种形式:

sipRequest = sipRequest.replaceFirst("(From: \")(.*)(\" <sip:)(.*)@(.*)>", "$1$2$3$4@" + sipServer + ">");

此正则表达式匹配,但不匹配以下一个:

sipRequest = sipRequest.replaceFirst("(^From: \")(.*)(\" <sip:)(.*)@(.*)>", "$1$2$3$4@" + sipServer + ">");

注意:唯一的区别是“From”之前的“^”符号。那么为什么这个表达式不匹配呢?它从一个新行开始,所以它应该匹配。

感谢帮助。

4

2 回答 2

6

引用 JavaDoc 的Pattern

默认情况下,正则表达式 ^ 和 $ 忽略行终止符,仅分别匹配整个输入序列的开头和结尾。如果 MULTILINE 模式被激活,则 ^ 在输入的开头和除输入结尾之外的任何行终止符之后匹配。在 MULTILINE 模式下,$ 在行终止符或输入序列的结尾之前匹配。

所以你需要设置多行标志,因为它的默认含义^字符串的开头,而不是行的开头。

于 2013-01-01T16:40:47.937 回答
3

该操作^仅在您使用Pattern.MULTILINE. 由于string.replaceAll()创建没有选项的模式,您必须自己创建模式,而不是创建匹配器并使用匹配器的替换工具。

于 2013-01-01T16:41:28.337 回答