【问题标题】:Java ^ regex does not match new line in stringJava ^ 正则表达式与字符串中的新行不匹配
【发布时间】:2013-01-01 16:36:38
【问题描述】:

这是我的字符串

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

感谢您的帮助。

【问题讨论】:

    标签: java regex newline match


    【解决方案1】:

    引用Pattern的JavaDoc:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多