re.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,752 行 · 第 1/5 页

JAVA
1,752
字号
                                }                            }                            break;                        // Alpha-numeric, digit, space, javaLetter, javaLetterOrDigit                        case E_ALNUM:                        case E_NALNUM:                        case E_DIGIT:                        case E_NDIGIT:                        case E_SPACE:                        case E_NSPACE:                            // Give up if out of input                            if (search.isEnd(idx))                            {                                return -1;                            }                            // Switch on escape                            switch (opdata)                            {                                case E_ALNUM:                                case E_NALNUM:                                    if (!(Character.isLetterOrDigit(search.charAt(idx)) == (opdata == E_ALNUM)))                                    {                                        return -1;                                    }                                    break;                                case E_DIGIT:                                case E_NDIGIT:                                    if (!(Character.isDigit(search.charAt(idx)) == (opdata == E_DIGIT)))                                    {                                        return -1;                                    }                                    break;                                case E_SPACE:                                case E_NSPACE:                                    if (!(Character.isWhitespace(search.charAt(idx)) == (opdata == E_SPACE)))                                    {                                        return -1;                                    }                                    break;                            }                            idx++;                            break;                        default:                            internalError("Unrecognized escape '" + opdata + "'");                    }                    break;                case OP_ANY:                    if((matchFlags & MATCH_SINGLELINE) == MATCH_SINGLELINE) {                        // Match anything                        if(search.isEnd(idx))                        {                            return -1;                        }                        idx++;                        break;                    }                    else                    {                        // Match anything but a newline                        if (search.isEnd(idx) || search.charAt(idx++) == '\n')                        {                            return -1;                        }                        break;                    }                case OP_ATOM:                    {                        // Match an atom value                        if (search.isEnd(idx))                        {                            return -1;                        }                        // Get length of atom and starting index                        int lenAtom = opdata;                        int startAtom = node + nodeSize;                        // Give up if not enough input remains to have a match                        if (search.isEnd(lenAtom + idx - 1))                        {                            return -1;                        }                        // Match atom differently depending on casefolding flag                        if ((matchFlags & MATCH_CASEINDEPENDENT) != 0)                        {                            for (int i = 0; i < lenAtom; i++)                            {                                if (Character.toLowerCase(search.charAt(idx++)) != Character.toLowerCase(instruction[startAtom + i]))                                {                                    return -1;                                }                            }                        }                        else                        {                            for (int i = 0; i < lenAtom; i++)                            {                                if (search.charAt(idx++) != instruction[startAtom + i])                                {                                    return -1;                                }                            }                        }                    }                    break;                case OP_POSIXCLASS:                    {                        // Out of input?                        if (search.isEnd(idx))                        {                            return -1;                        }                                                switch (opdata)                        {                            case POSIX_CLASS_ALNUM:                                if (!Character.isLetterOrDigit(search.charAt(idx)))                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_ALPHA:                                if (!Character.isLetter(search.charAt(idx)))                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_DIGIT:                                if (!Character.isDigit(search.charAt(idx)))                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_BLANK: // JWL - bugbug: is this right??                                if (!Character.isSpaceChar(search.charAt(idx)))                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_SPACE:                                if (!Character.isWhitespace(search.charAt(idx)))                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_CNTRL:                                if (Character.getType(search.charAt(idx)) != Character.CONTROL)                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_GRAPH: // JWL - bugbug???                                switch (Character.getType(search.charAt(idx)))                                {                                    case Character.MATH_SYMBOL:                                    case Character.CURRENCY_SYMBOL:                                    case Character.MODIFIER_SYMBOL:                                    case Character.OTHER_SYMBOL:                                        break;                                                                            default:                                        return -1;                                }                                break;                                                            case POSIX_CLASS_LOWER:                                if (Character.getType(search.charAt(idx)) != Character.LOWERCASE_LETTER)                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_UPPER:                                if (Character.getType(search.charAt(idx)) != Character.UPPERCASE_LETTER)                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_PRINT:                                if (Character.getType(search.charAt(idx)) == Character.CONTROL)                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_PUNCT:                            {                                int type = Character.getType(search.charAt(idx));                                switch(type)                                {                                    case Character.DASH_PUNCTUATION:                                    case Character.START_PUNCTUATION:                                    case Character.END_PUNCTUATION:                                    case Character.CONNECTOR_PUNCTUATION:                                    case Character.OTHER_PUNCTUATION:                                        break;                                                                            default:                                        return -1;                                }                            }                            break;                            case POSIX_CLASS_XDIGIT: // JWL - bugbug??                            {                                boolean isXDigit = ((search.charAt(idx) >= '0' && search.charAt(idx) <= '9') ||                                                    (search.charAt(idx) >= 'a' && search.charAt(idx) <= 'f') ||                                                    (search.charAt(idx) >= 'A' && search.charAt(idx) <= 'F'));                                if (!isXDigit)                                {                                    return -1;                                }                            }                            break;                                                        case POSIX_CLASS_JSTART:                                if (!Character.isJavaIdentifierStart(search.charAt(idx)))                                {                                    return -1;                                }                                break;                                                            case POSIX_CLASS_JPART:                                if (!Character.isJavaIdentifierPart(search.charAt(idx)))                                {                                    return -1;                                }                                break;                            default:                                internalError("Bad posix class");                                break;                        }                                            // Matched.                        idx++;                    }                    break;                case OP_ANYOF:                    {                        // Out of input?                        if (search.isEnd(idx))                        {                            return -1;                        }                        // Get character to match against character class and maybe casefold                        char c = search.charAt(idx);                        boolean caseFold = (matchFlags & MATCH_CASEINDEPENDENT) != 0;                        if (caseFold)                        {                            c = Character.toLowerCase(c);                        }                        // Loop through character class checking our match character                        int idxRange = node + nodeSize;                        int idxEnd = idxRange + (opdata * 2);                        boolean match = false;                        for (int i = idxRange; i < idxEnd; )                        {                            // Get start, end and match characters                            char s = instruction[i++];                            char e = instruction[i++];                            // Fold ends of range and match character                            if (caseFold)                            {                                s = Character.toLowerCase(s);                                e = Character.toLowerCase(e);                            }                            // If the match character is in range, break out                            if (c >= s && c <= e)                            {                                match = true;                                break;                            }                        }                        // Fail if we didn't match the character class                        if (!match)                        {                            return -1;                        }                        idx++;                    }                    break;                case OP_BRANCH:                {                    // Check for choices                    if (instruction[next + offsetOpcode] != OP_BRANCH)                    {                        // If there aren't any other choices, just evaluate this branch.                        node += nodeSize;                        continue;                    }                    // Try all available branches                    short nextBranch;                    do                    {                        // Try matching the branch against the string                        if ((idxNew = matchNodes(node + nodeSize, maxNode, idx)) != -1)                        {                            return idxNew;                        }                                                // Go to next branch (if any)                        nextBranch = (short)instruction[node + offsetNext];                        node += nextBranch;                    }                    while (nextBranch != 0 && (instruction[node + offsetOpcode] == OP_BRANCH));                    // Failed to match any branch!                    return -1;                }                case OP_NOTHING:                case OP_GOTO:                    // Just advance to the next node without doing anything                    break;                case OP_END:                    // Match has succeeded!                    setParenEnd(0, idx);                    return idx;                default:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?