gpt4 book ai didi

java - 检查字符串是否包含数组中的字符

转载 作者:行者123 更新时间:2023-12-05 08:37:08 31 4
gpt4 key购买 nike

我想检查作为文件名的字符串是否包含来自 ILLEGAL_CHARACTERS 的非法参数。我可以简单地使用 for 循环,但我想通过 Streams 来完成。

我的代码:

package shared;

import java.util.Arrays;

public class Validator {
private static final Character[] ILLEGAL_CHARACTERS =
{'/','\n','\r','\t','\0','\f','`','?','*','\\','<','>','|','\"',':'};

public static boolean fileNameIsValid(String fileName) {
return Arrays.stream(ILLEGAL_CHARACTERS).anyMatch(fileName::contains);
}
}

问题出在 contains 方法中,因为它需要 CharSequence 而不是 char。有没有办法在不将 Character[] 类型更改为 String[] 的情况下通过流执行此操作?

最佳答案

Streams 可能不是最适合这里的。此外,现在您的解决方案具有二次复杂性(N*M,其中 N 是文件名长度,M 是非法字符数组的大小),性能不是很好。正如评论中所建议的,您可以使用正则表达式:

private static final Pattern ILLEGAL_CHARACTERS_REGEX =
Pattern.compile("[/\n\r\t\0\f`?*\\\\<>|\":]");

public static boolean fileNameIsValidRegex(String fileName) {
return !ILLEGAL_CHARACTERS_REGEX.matcher(fileName).find();
}

或者,如果您的非法字符集仅限于 ASCII,您可以使用位集来压缩一些性能:

private static final BitSet ILLEGAL_CHARACTERS = new BitSet();

static {
for (char c : new char[]{
'/','\n','\r','\t','\0','\f','`','?','*','\\','<','>','|','\"',':'}) {
ILLEGAL_CHARACTERS.set(c);
}
}

public static boolean fileNameIsValid(String fileName) {
return fileName.chars().noneMatch(ILLEGAL_CHARACTERS::get);
}

关于java - 检查字符串是否包含数组中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66597130/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com