2

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

我的意思是我可以在while循环中自己拆分行。但是是否有任何库或标准 API 可以实现此功能?

更新这是 Ruby 解决方案:

if text =~ /PATTERN/
4

3 回答 3

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();
}
于 2013-05-21T12:08:01.573 回答
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|$)是换行符或字符串的结尾。
*+是零或更多 - 但这是一个所有格限定词

所以整个事情基本上检查每一行都匹配This is a string

如果你想要它在一个函数中:

boolean allLinesMatch(String string, String regex)
{
  return string.matches("(" + regex + "(\r?\n|$))*+");
}

Java 正则表达式参考

为什么需要所有格限定词的主要示例:

如果您将字符串This is a string.重复几次(准确地说是 34 次),但最后一个字符串 be This is a string.s(与正则表达式不匹配)并且 have ,您最终What you want to match会等待很长一段时间..* .* .*\\.*

*示例- 在我的机器上运行 - 超过几个小时,之后我停止了它。

*+示例- 我的机器上的运行时间 - 不到一秒

有关详细信息,请参阅灾难性回溯

于 2013-05-21T12:06:03.650 回答
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;
}
于 2013-05-21T12:23:43.570 回答