1

我正在创建一个循环,它将测试用户输入的每个子字符串以测试非法字符。但是,它仅检测非法字符何时位于输入的最后位置。我觉得解决方案可能很简单,但我似乎无法弄清楚,我该如何纠正这个问题,以便它可以在字符串中的任何位置检测到它?

public class IllegalFileName {

public static final Set<String> illegalCharsSet = new HashSet<String>(
        Arrays.asList("/", "\n", "\r", "\t", "\0", "\f", "`", "?", "*",
                "\\", "<", ">", "|", "\"", ":", ".", "£", "$", "%", "^",
                "&", ")", "("));

public static void main(String[] args) {

    String illegalNameText = "££!233";
    String illegalNameText2 = "££!233$";
    boolean illegalName = false;

    for (int i = 0; i <= illegalNameText.length() - 1; i++) {
        System.out.println(i);
        if (illegalCharsSet.contains(illegalNameText.substring(i))) {
            System.out.println(illegalNameText + " is illegal");
            illegalName = true;
            System.out.println(illegalNameText.substring(i));
        }

    }

    for (int i = 0; i <= illegalNameText2.length() - 1; i++) {
        System.out.println(i);
        if (illegalCharsSet.contains(illegalNameText2.substring(i))) {
            System.out.println(illegalNameText2 + " is illegal");
            illegalName = true;
            System.out.println(illegalNameText2.substring(i));
        }
    }
}
}
4

3 回答 3

1

substring(i)返回从i包含到n排除的子字符串(其中n是初始字符串的大小)。

使用一组字符代替 ( Set<Character>,由 初始化Arrays.asList('/', '\n', ...),并使用containson theString.charAt(i)

于 2013-03-18T15:39:20.897 回答
1

您想检查它是否包含非法字符,因此是illegalCharsSet. 我认为应该是这样的:

for (int i = 0; i <= illegalNameText.length() - 1; i++) {
    System.out.println(i);
    if (illegalNameText.contains(illegalCharsSet.get(i)) {
        System.out.println(illegalNameText + " is illegal");
        illegalName = true;
    }
}
于 2013-03-18T15:39:29.307 回答
1

我会简单地遍历非法字符然后做

if (illegalNameText.contains(illegalChar)) {...

或类似的。更简洁的解决方案可能是使用Java 正则表达式并执行类似的操作。

if (Pattern.matches("[£$%]", illegalNameText)) {...

替换您的全套非法字符。为了提高效率,您可能需要预先初始化/编译上面的正则表达式。

于 2013-03-18T15:39:38.167 回答