📄 re.java
字号:
case OP_EOL:
// If we're not at the end of string
if (!search.isEnd(0) && !search.isEnd(idx))
{
// If we're multi-line matching
if ((matchFlags & MATCH_MULTILINE) == MATCH_MULTILINE)
{
// Give up if we're not at the end of a line
if (! isNewline(idx)) {
return -1;
} else {
break;
}
}
return -1;
}
break;
case OP_ESCAPE:
// Which escape?
switch (opdata)
{
// Word boundary match
case E_NBOUND:
case E_BOUND:
{
char cLast = ((idx == getParenStart(0)) ? '\n' : search.charAt(idx - 1));
char cNext = ((search.isEnd(idx)) ? '\n' : search.charAt(idx));
if ((Character.isLetterOrDigit(cLast) == Character.isLetterOrDigit(cNext)) == (opdata == E_BOUND))
{
return -1;
}
}
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -