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', ...)、 on を使用containstheString.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 に答える