只有最后一个子字符串在java for循环中进行测试

时间:2013-03-18 15:36:23

标签: java string loops substring

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

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));
        }
    }
}
}

3 个答案:

答案 0 :(得分:1)

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

改为使用一组字符(Set<Character>,由Arrays.asList('/', '\n', ...)初始化,并在contains上使用theString.charAt(i)

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

我只是遍历非法字符,然后执行

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

或类似的。更简洁的解决方案可能是使用Java regular expressions并执行类似的操作。

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

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