从字符串集推断正则表达式模式

时间:2019-06-07 18:29:25

标签: java regex regular-language

我想使用Java将字符串集转换为正则表达式。

我为此搜索了很多东西,但是互联网上没有这样令人满意的答案可以解决我的问题。所以我想在这里问。

如果可以的话,首先可以将其转换,然后请建议我摆脱目前所面临的问题的方法?

假设我有几组字符串

abb
abababb
babb
aabb
bbbbabb
...

我想为其做一个正则表达式,例如

(a+b)*abb

这怎么可能?

4 个答案:

答案 0 :(得分:3)

您正在寻找一种从一组示例中infer正则表达式的方法。对于一般情况,这是一个非平凡的计算问题。有关详情,请参见this post

答案 1 :(得分:3)

如果您有一组字符串,并且想要构建一个与任何这些字符串匹配的正则表达式,则应构建一个使用| OR模式的正则表达式。

由于字符串可能包含正则表达式特殊字符,因此需要将其引号。

要确保最佳字符串匹配,您需要首先匹配最长字符串。例如。如果abaabax都在列表中,并且要扫描的文本包含abax,我们希望在第二个字符串而不是第一个字符串上进行匹配。

因此,您可以这样做:

public static String toRegex(Iterable<String> strings) {
    return StreamSupport.stream(strings.spliterator(), false)
            .sorted(Comparator.comparingInt(String::length).reversed())
            .map(Pattern::quote)
            .collect(Collectors.joining("|"));
}

答案 2 :(得分:0)

您可以使用here中所述的Pattern.compile方法。

答案 3 :(得分:0)

我不相信你可以。

问题是您只想提供有效字符串的全部集合中的一部分,并且该算法无法从给定的子集中推断出确切的完整集合。如果确实提供了完整的有效字符串集(似乎不太可能),则可以在注释中使用David Zimmerman的答案。或者,也许更有效地,只需使用Set即可容纳完整的有效字符串集并测试候选字符串。