检查所有行是否与Java中的regex模式匹配

时间:2013-05-21 12:00:45

标签: java regex pattern-matching

如何检查所有行是否与Java中的正则表达式匹配。

我的意思是我能够在循环中自行分割线条。但是有没有实现此功能的库或标准API?

UPDATE 这是Ruby解决方案:

if text =~ /PATTERN/

3 个答案:

答案 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|$))*+");
}

Java regex reference

您需要占有资格的原因示例:

如果您重复使用字符串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;
}