我正在创建一个循环,它将测试用户输入的每个子字符串以测试非法字符。但是,它仅检测非法字符何时位于输入的最后位置。我觉得好像解决方案可能很简单,但我似乎无法弄明白,我怎么能纠正这个问题所以它会在字符串中的任何位置检测到它?
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));
}
}
}
}
答案 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)) {...
替换你的全套非法字符。为了提高效率,您可能需要预先初始化/编译上面的正则表达式。