在Java字符串中搜索一组字符串的有效方法

提问

我有一组大小约为100-200的元素.令样本元素为X.

每个元素都是一组字符串(此类字符串的数量在1-4之间). X = {s1,s2,s3}

对于给定的输入字符串(大约100个字符),例如P,我想测试字符串中是否存在X.

X出现在P中,因为所有s都属于X,而s是P的子串.

这组元素可用于预处理.

我希望这在Java中尽可能快.可能不符合我要求的方法:

>检查所有字符串s是否都是P的子字符串似乎是一项昂贵的操作
>因为s可以是P的任何子串(不一定是单词),所以我不能使用单词的哈希
>我不能直接使用正则表达式,因为s1,s2,s3可以以任何顺序出现,并且所有字符串都必须以子字符串形式出现

现在,我的方法是从每个X构造一个巨大的正则表达式,并对字符串顺序进行所有可能的排列.由于X <= 4中的元素数量,这仍然是可行的.如果有人可以为我提供更好(更快/更优雅)的方法,那就太好了.

请注意,该元素集可用于预处理,我想要Java中的解决方案.

最佳答案

您可以直接使用正则表达式:

Pattern regex = Pattern.compile(
    "^               # Anchor search to start of string\n" +
    "(?=.*s1)        # Check if string contains s1\n" +
    "(?=.*s2)        # Check if string contains s2\n" +
    "(?=.*s3)        # Check if string contains s3", 
    Pattern.DOTALL | Pattern.COMMENTS);
Matcher regexMatcher = regex.matcher(subjectString);
foundMatch = regexMatcher.find();

如果字符串中所有三个子字符串都存在,则foundMatch为true.

请注意,如果“针线”可能包含正则表达式元字符,则可能需要转义.

评论