如何在 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】:matches
(String
和 Matchers
类)尝试匹配完整的输入字符串。
您需要改用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 正则表达式(Invalid escape sequence (valid ones are \b \t \n \f \r \"
在Chrome中,最终使用带有正则表达式的重定向扩展程序,如何将所有facebook.com网址重定向到mbasic.facebook.com URLS