如何在 java 8 正则表达式中使用 \R [重复]

Posted

技术标签:

【中文标题】如何在 java 8 正则表达式中使用 \\R [重复]【英文标题】:How to use \R in java 8 regex [duplicate]如何在 java 8 正则表达式中使用 \R [重复] 【发布时间】:2018-04-25 17:44:40 【问题描述】:

我正在尝试使用来自 java 8 的新 \R 正则表达式匹配器。 但是,对于以下代码:

public static void main(String[] args)
  
    String s = "This is \r\n a String with \n Different Newlines \r and other things.";
    System.out.println(s);
    System.out.println(Pattern.matches("\\R", s));
    if (Pattern.matches("\\R", s)) // <-- is always false
    
      System.out.println("Matched");
    

    System.out.println(s.replaceAll("\\R", "<br/>")); //This is a String with <br/> Different Newlines <br/> and other things.
  

Pattern.matches 总是返回 false,而 replaceAll 方法似乎确实找到了匹配项并执行了我想要的操作。如何使 Pattern.matches 工作?

我也尝试了很长一段时间,但仍然无法正常工作:

   Pattern p = Pattern.compile("\\R");
    Matcher m = p.matcher(s);
    boolean b = m.matches();
    System.out.println(b);

【问题讨论】:

【参考方案1】:

matchesStringMatchers 类)尝试匹配完整的输入字符串。

您需要改用matcher.find

Pattern p = Pattern.compile("\\R");
Matcher m = p.matcher(s);
boolean b = m.find();
System.out.println(b);

来自Java docs:

\R 匹配任何 Unicode 换行序列,相当于\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

PS;如果您想知道输入是否包含换行符,那么这一行将适合您:

boolean b = s.matches("(?s).*?\\R.*");

注意在\R 的任一侧使用.* 以确保我们匹配完整的输入。您还需要(?s) 启用DOTALL 模式才能将多行字符串与.* 匹配

【讨论】:

那么使用(Pattern.matches("\\R", s)有错吗?我认为我正在寻找的是一种单线解决方案 是的,除非输入字符串只是一个换行符,否则匹配失败 甜蜜。关于如何将所有这些变成一个易于阅读的衬里的任何建议? 抱歉,再次编辑。您需要(?s) 才能启用DOTALL 你应该避免Catastrophic Backtracking。就像(?s).*?\R.* 一样简单(第一部分的勉强量词)。

以上是关于如何在 java 8 正则表达式中使用 \R [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java基础学习——8正则表达式

java 正则表达式(Invalid escape sequence (valid ones are \b \t \n \f \r \" &#

如何在r中使用正则表达式删除单词之前的所有措辞?

在Chrome中,最终使用带有正则表达式的重定向扩展程序,如何将所有facebook.com网址重定向到mbasic.facebook.com URLS

如何在 R 中使用正则表达式查找不带逗号的潜文本?

正则表达式批量重命名 OS X 终端中的文件