如何检查所有行是否与 Java 中的正则表达式模式匹配。
我的意思是我可以在while循环中自己拆分行。但是是否有任何库或标准 API 可以实现此功能?
更新这是 Ruby 解决方案:
if text =~ /PATTERN/
如何检查所有行是否与 Java 中的正则表达式模式匹配。
我的意思是我可以在while循环中自己拆分行。但是是否有任何库或标准 API 可以实现此功能?
更新这是 Ruby 解决方案:
if text =~ /PATTERN/
这是一个使用Guava的实用方法,如果提供的文本中的每一行都与提供的模式匹配,则返回 true:
public static boolean matchEachLine(String text, Pattern pattern){
return FluentIterable.from(Splitter.on('\n').split(text))
.filter(Predicates.not(Predicates.contains(pattern)))
.isEmpty();
}
我知道没有标准的 API 功能可以做到这一点,但是,这样的事情很容易:
string.matches("(What you want to match(\r?\n|$))*+")
用法:
String string = "This is a string\nThis is a string\nThis is a string";
System.out.println(string.matches("(This is a string(\r?\n|$))*+"));
\r?\n
涵盖最常见的换行符。
$
是字符串的结尾。
(\r?\n|$)
是换行符或字符串的结尾。
*+
是零或更多 - 但这是一个所有格限定词。
所以整个事情基本上检查每一行都匹配This is a string
。
如果你想要它在一个函数中:
boolean allLinesMatch(String string, String regex)
{
return string.matches("(" + regex + "(\r?\n|$))*+");
}
为什么需要所有格限定词的主要示例:
如果您将字符串This is a string.
重复几次(准确地说是 34 次),但最后一个字符串 be This is a string.s
(与正则表达式不匹配)并且 have ,您最终What you want to match
会等待很长一段时间..* .* .*\\.
*
*
示例- 在我的机器上运行 - 超过几个小时,之后我停止了它。
*+
示例- 我的机器上的运行时间 - 不到一秒。
有关详细信息,请参阅灾难性回溯。
这是我使用的一个
public static boolean multilineMatches(final String regex, final String text) {
final Matcher m = Pattern.compile("^(.*)$", Pattern.MULTILINE).matcher(text);
final Pattern p = Pattern.compile(regex);
while(m.find()) {
if (!p.matcher(m.group()).find()) {
return false;
}
}
return true;
}