用一般的字符去拆分字符串都没有问题,可用"|"的时候就不行了,会把每个字符都拆开,怎么解决?

解决方案 »

  1.   

    ch = peek();
                switch (ch) {
                case '(':
                    // Because group handles its own closure,
                    // we need to treat it differently
                    node = group0();
                    // Check for comment or flag group
                    if (node == null)
                        continue;
                    if (head == null)
                        head = node;
                    else
                        tail.next = node;
                    // Double return: Tail was returned in root
                    tail = root;
                    continue;
                case '[':
                    node = clazz(true);
                    break;
                case '\\':
                    ch = nextEscaped();
                    if (ch == 'p' || ch == 'P') {
                        boolean comp = (ch == 'P');
                        boolean oneLetter = true;
                        ch = next(); // Consume { if present
                        if (ch != '{') {
                            unread();
                        } else {
                            oneLetter = false;
                        }
                        node = family(comp, oneLetter);
                    } else {
                        unread();
                        node = atom();
                    }
                    break;
                case '^':
                    next();
                    if (has(MULTILINE)) {
                        if (has(UNIX_LINES))
                            node = new UnixCaret();
                        else
                            node = new Caret();
                    } else {
                        node = new Begin();
                    }
                    break;
                case '$':
                    next();
                    if (has(UNIX_LINES))
                        node = new UnixDollar(has(MULTILINE));
                    else
                        node = new Dollar(has(MULTILINE));
                    break;
                case '.':
                    next();
                    if (has(DOTALL)) {
                        node = new All();
                    } else {
                        if (has(UNIX_LINES))
                            node = new UnixDot();
                        else {
                            node = new Dot();
                        }
                    }
                    break;
                case '|':
                case ')':
                    break LOOP;
                case ']': // Now interpreting dangling ] and } as literals
                case '}':
                    node = atom();
                    break;
                case '?':
                case '*':
                case '+':
                    next();
                    return error("Dangling meta character '" + ((char)ch) + "'");
                case 0:
                    if (cursor >= patternLength) {
                        break LOOP;
                    }
                    // Fall through
                default:
                    node = atom();
                    break;
                }这是处理时的一段代码,这里的这些字符都进行过一些处理的
      

  2.   

    用 StringTokenizer 就可以,这个可以区分关键字符,不需要转义,具体用法参见API吧。