java - Java 正则表达式中的新行和美元符号

标签 java regex newline

我知道 $ 用于检查 Java 正则表达式中是否有行尾。

对于以下代码:

String test_domain = "http://www.google.com/path\nline2\nline3";
test_domain = test_domain.replaceFirst("(\\.[^:/]+).*$?", "$1");
System.out.println(test_domain);

输出是:

http://www.google.com
line2
line3

我假设模式 (\\.[^:/]+).*$? 匹配第一行,即 http://www.google.com/path$1http://www.google.com? 不情愿地匹配(因此匹配第一行。)

但是,如果我删除模式中的 ? 并实现以下代码:

String test_domain = "http://www.google.com/path\nline2\nline3";
test_domain = test_domain.replaceFirst("(\\.[^:/]+).*$", "$1");
System.out.println(test_domain);

输出是:

http://www.google.com/path
line2
line3

我认为它应该给出结果 http://www.google.com

  1. (\\.[^:/]+) 匹配 http://www.google.com
  2. .*$ 匹配 /path\nline2\nline3

我对正则表达式的误解在哪里?

最佳答案

您有一个多行输入并尝试在您的正则表达式中为每一行使用 anchor $ 但不使用 MULTILINE 标志。您所需要的只是正则表达式前面的 (?m) 模式:

String test_domain = "http://www.google.com/path\nline2\nline3";
test_domain = test_domain.replaceFirst("(?m)(\\.[^:/]+).*$", "$1");
System.out.println(test_domain);

这将输出:

http://www.google.com
line2
line3

RegEx Demo

如果没有 MULTILINEDOTALL 模式,您的正则表达式:(\.[^:/]+).*$ 将无法匹配由于存在 .*$ 而输入,因为点将不匹配换行符并且 $(行尾)出现在 2 个换行符之后。

关于java - Java 正则表达式中的新行和美元符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404224/

相关文章:

java - 如何从字符串中提取日期并将其放入Java中的日期变量

javascript - 用破折号替换字母

python - 组合正则表达式模式以匹配字符串的开头和结尾并删除分隔符

powershell - 为什么在PowerShell的Get-Content,Regex和Set-Content之后都没有换行符?

java - 防止水管破裂的方法有哪些?

java - 单击文本时没有任何反应

php - 如何将数组内爆到新行

django - 使用 CSV Django 模块以通用换行模式打开文件

java - 为什么内部类可以覆盖私有(private) final方法?

java - IBM-RFT:在窗口中查找_really_可见对象