奇怪的角色比较 - 不平等的角色是相等的

时间:2016-05-05 20:18:38

标签: java validation

以下简单代码应使用除数学符号,小写和少量其他符号(如~)之外的字符进行转义。

public class Sample {

    public static void main(String[] args) {

        Sample sample = new Sample();

        String expr = " ( a , + b )/..[c3 ";
        System.out.println(sample.clear(expr, true));
        //OUT: (a+b)/[c

        expr = "(a+b)/{}c";
        System.out.println(sample.clear(expr, true));
        //OUT: (a+b)/}c

        expr = "(a+b)/][c";
        System.out.println(sample.clear(expr, true));
        //(a+b)/[c
    }

    public String clear(String line, final boolean isInfix) {

        line = line.trim();
        line = line.replaceAll("\\s", "");


        for (int i = 0; i < line.length(); i++) {

            char c = line.charAt(i);

            if (!(Character.isLowerCase(c) || isAllowedSymbol(c, isInfix))) {

                line = line.replace(Character.toString(c), "");
            }

        }

        if (line.isEmpty()) return null;


        return line;
    }

    private boolean isAllowedSymbol(char c, boolean isInfix) {

        char allowed[] = {'~', '^', '*', '/', '%', '+', '-', '<', '>', '!', '&', '|', '='};
        char infixAllowed[] = {'~', '^', '*', '/', '%', '+', '-', '<', '>', '!', '&', '|', '=', '(', ')'};

        char chars[] = allowed;
        int maxRange = allowed.length;

        if (isInfix) {

            chars = infixAllowed;
            maxRange = infixAllowed.length;
        }

        for (int j = 0; j < maxRange; j++) {

            if (c == chars[j]) {

                return true;
            }
        }

        return false;
    }

}

为什么跟随输入字符会导致如此奇怪和错误的输出?

应删除{ }] [等字符。 例如:

IN
 ( a , + b )/..[c3 
(a+b)/{}c
(a+b)/][c

OUT
(a+b)/[c
(a+b)/}c
(a+b)/[c

运行时:

% java -version                                             
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

% javac -version
javac 1.8.0_66

在Arch x64下运行

1 个答案:

答案 0 :(得分:2)

这是因为您要从输入字符串中删除有问题的字符,然后继续按字符索引进行迭代。

所以(在第二个例子中),当i等于6时,删除不匹配&#34; {&#34;,然后line变量包含字符串&#34;( A + b)/} C&#34 ;.然后,继续for循环,i等于7,检查&#34; c&#34;字符。

因为您已从字符串中删除了某个字符,所以您永远不会检查&#34;}&#34;字符。

让我把它拼出来。这是line变量,在i等于6的循环迭代之前:

012345678
(a+b)/{}c

在那个循环迭代中,你要检查&#34; {&#34;字符,并且您正确地标识它应该被删除,因此在下一次迭代开始时(i等于7),再次在这里line

012345678
(a+b)/}c

现在,由于i为7,因此此迭代将检查&#34; c&#34;角色,你可以看到,你永远不会检查&#34;}&#34;字符。

相关问题