Java ^ regex与字符串中的新行不匹配

时间:2013-01-01 16:36:38

标签: java regex newline match

这是我的字符串

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”之前的“^”符号。 那么为什么这个表达不匹配?它从一个新行开始,因此应匹配。

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

引用Pattern的JavaDoc:

  

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

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

答案 1 :(得分:3)

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