【发布时间】:2017-07-05 09:20:54
【问题描述】:
给定以下表达式:
Pattern.compile("^Test.*\n").matcher("Test 123\nNothing\nTest 2\n").replaceAll("foo\n")
这会产生:
"foo\nNothing\nTest 2\n"
对我来说。我希望最后一行也被替换为foo\n,因为在输入字符串中Test 2 之前有一个换行符。
为什么这里的正则表达式不匹配?
【问题讨论】:
给定以下表达式:
Pattern.compile("^Test.*\n").matcher("Test 123\nNothing\nTest 2\n").replaceAll("foo\n")
这会产生:
"foo\nNothing\nTest 2\n"
对我来说。我希望最后一行也被替换为foo\n,因为在输入字符串中Test 2 之前有一个换行符。
为什么这里的正则表达式不匹配?
【问题讨论】:
您必须在模式中添加多行标志:Pattern.MULTILINE。
Pattern.compile("^Test.*\n", Pattern.MULTILINE).matcher("Test 123\nNothing\nTest 2\n").replaceAll("foo\n")
默认情况下匹配只有一行。更多信息见the javadoc
【讨论】:
在您的正则表达式的开头,您有一个^ 符号,它通常将正则表达式锚定到测试字符串的开头。您需要指定多行正则表达式选项 (Oracle Documentation link) 以使其适用于每一行的开头。
试试这个(为了清晰起见,我已将线条分开,请随意将其单线返回):
Pattern.compile("^Test.*\n", Pattern.MULTILINE)
.matcher("Test 123\nNothing\nTest 2\n")
.replaceAll("foo\n")
很遗憾,我目前没有设置 Java 环境,所以我无法自己检查。
【讨论】: