如何检查所有行是否与Java中的正则表达式匹配。
我的意思是我能够在而循环中自行分割线条。但是有没有实现此功能的库或标准API?
UPDATE 这是Ruby解决方案:
if text =~ /PATTERN/
答案 0 :(得分:2)
这是一个使用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();
}
答案 1 :(得分:1)
我知道没有标准的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|$)
是新行或字符串的结尾
*+
为零或更多 - 但这是a possessive qualifier。
所以整个事情基本上检查每一行是否匹配This is a string
。
如果你想在一个函数中使用它:
boolean allLinesMatch(String string, String regex)
{
return string.matches("(" + regex + "(\r?\n|$))*+");
}
您需要占有资格的原因示例:
如果您重复使用字符串This is a string.
几次(确切地说是34次),但最后一个字符串为This is a string.s
(与正则表达式不匹配)并且What you want to match
是.* .* .*\\.
,你最后等了*
。
*
example - 我的机器上的运行时间 - 超过几个小时,之后我停止了它。
*+
example - 我的机器上的运行时间 - 远远小于一秒。
有关详细信息,请参阅Catastrophic Backtracking。
答案 2 :(得分:1)
这是我使用的
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;
}