检查字符是否与可接受字符列表匹配

时间:2013-10-13 23:36:34

标签: java regex

我正在编写一个执行分隔符检查的程序。当用户输入诸如

之类的表达式时
12+{2*[3*(24+45)+5]}

我需要检查分隔符是否匹配(类似于java编译器在表达式中检查的内容)。

我知道这可以通过大量if / else if语句来完成,但我记得使用正则表达式来表示字符串,例如:

if(s.matches("[abc]+")
System.out.print(s);

但这对角色不起作用。如果我能写出类似于上面的表达式,那就太好了:

for(byte i = 0; i < aString.length(); i++)
{
    if(aString.charAt(i).matches("[({[]})]+")   // maybe '[]' is a problem
    stack.push(aString.charAt(i));
}

字符是否存在这样的方法?我该怎么办?

2 个答案:

答案 0 :(得分:2)

您可以维护一个List<Character>来保持&#34;分隔符&#34;然后对字符串中的每个字符运行list.contains()以确定它是否是有效的分隔符 - 这比任务的正则表达式更高效。您可能希望使用String作为循环变量重新考虑在byte上进行循环;这对你来说可能并不总是很好。对于一个简单的字符串(除了BMP之外没有花哨的Unicode字符),您可以使用for (char ch : aString.toCharArray()) {...}循环它。

答案 1 :(得分:2)

我想说一个解决方法是使用Stack并在每个输入字符串处重新开始。

  1. 当找到一个开放式括号{, [, (时,推入堆栈。
  2. 找到关闭括号}, ], )时,弹出来自堆栈。
  3. 使用if语句比较是否有匹配。如果不这样做,请返回false
  4. 完成搜索后,检查是否有空堆栈并返回truefalse

    Stack Example: Delimiter Matching

    如果您缺少分隔符匹配,则使用Stack的此示例将仅返回false

    import java.util.Stack;
    
    class BracketChecker {
      private String input;
    
      public BracketChecker(String in) {
        input = in;
      }
    
      public void check() {
        Stack<Character> theStack = new Stack<Character>();
    
        for (int j = 0; j < input.length(); j++) {
          char ch = input.charAt(j);
          switch (ch) {
          case '{': 
          case '[':
          case '(':
            theStack.push(ch);
            break;
          case '}': 
          case ']':
          case ')':
            if (!theStack.isEmpty()) {
              char chx = theStack.pop();
              if ((ch == '}' && chx != '{') || 
                  (ch == ']' && chx != '[') || 
                  (ch == ')' && chx != '('))
                  System.out.println("Error: " + ch + " at " + j);
              } else
                  System.out.println("Error: " + ch + " at " + j);
                  break;
                  default:
                  break;
              }
        }
        if (!theStack.isEmpty()){
          System.out.println("Error: missing right delimiter");
        }
      }
    }
    
    class delimTest {
      public static void main(String[] args) {
    
        String input = "12+{2*[3*(24+45)+5}";
    
        BracketChecker theChecker = new BracketChecker(input);
        theChecker.check();
      }
    }