这是我的字符串
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”之前的“^”符号。 那么为什么这个表达不匹配?它从一个新行开始,因此应匹配。
感谢您的帮助。
答案 0 :(得分:6)
引用Pattern
的JavaDoc:
默认情况下,正则表达式^和$忽略行终止符,并且仅分别匹配整个输入序列的开头和结尾。如果激活MULTILINE模式,则^在输入开始时和任何行终止符之后匹配,但输入结束时除外。当处于MULTILINE模式时,$匹配行终止符或输入序列的结尾。
所以你需要设置多行标志,因为^
的默认含义是字符串的开头,而不是行的开头。
答案 1 :(得分:3)
仅当您使用^
时,操作Pattern.MULTILINE
才有效。由于string.replaceAll()
创建没有选项的模式,您必须自己创建模式,而不是创建匹配器并使用匹配器的替换设施。