以下简单代码应使用除数学符号,小写和少量其他符号(如~
)之外的字符进行转义。
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下运行
答案 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;字符。