⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 perl5matcher.java

📁 jakarta-oro-2.0.8 正则表达式 引擎 源代码
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	    tmp = OpCode._isWordCharacter(__previousChar);	  while(__currentOffset < endOffset) {	    ch = __input[__currentOffset];	    if(tmp != OpCode._isWordCharacter(ch)){	      tmp = !tmp;	      if(__tryExpression(__currentOffset)) {		success = true;		break _mainLoop;	      }	    }	    ++__currentOffset;	  }	  if((minLength > 0 || tmp) && 	     __tryExpression(__currentOffset)) {	    success = true;	    break _mainLoop;	  }	  break;	case OpCode._NBOUND:	  if(minLength > 0) {	    ++dontTry;	    --endOffset;	  }	  if(__currentOffset != beginOffset) {	    ch = __input[__currentOffset - 1];	    tmp = OpCode._isWordCharacter(ch);	  } else	    tmp = OpCode._isWordCharacter(__previousChar);	  while(__currentOffset < endOffset) {	    ch = __input[__currentOffset];	    if(tmp != OpCode._isWordCharacter(ch))	      tmp = !tmp;	    else if(__tryExpression(__currentOffset)) {	      success = true;	      break _mainLoop;	    }	    ++__currentOffset;	  }	  if((minLength > 0 || !tmp) &&	     __tryExpression(__currentOffset)) {	    success = true;	    break _mainLoop;	  }	  break;	case OpCode._ALNUM:	  while(__currentOffset < endOffset) {	    ch = __input[__currentOffset];	    if(OpCode._isWordCharacter(ch)) {	      if(tmp && __tryExpression(__currentOffset)) {		success = true;		break _mainLoop;	      } else		tmp = doEvery;	    } else	      tmp = true;	    ++__currentOffset;	  }	  break;	case OpCode._NALNUM:	  while(__currentOffset < endOffset) {	    ch = __input[__currentOffset];	    if(!OpCode._isWordCharacter(ch)) {	      if(tmp && __tryExpression(__currentOffset)) {		success = true;		break _mainLoop;	      } else		tmp = doEvery;	    } else	      tmp = true;	    ++__currentOffset;	  }	  break;	case OpCode._SPACE:	  while(__currentOffset < endOffset) {	    if(Character.isWhitespace(__input[__currentOffset])) {	      if(tmp && __tryExpression(__currentOffset)) {		success = true;		break _mainLoop;	      } else		tmp = doEvery;	    } else	      tmp = true;	    ++__currentOffset;	  }	  break;	case OpCode._NSPACE:	  while(__currentOffset < endOffset) {	    if(!Character.isWhitespace(__input[__currentOffset])) {	      if(tmp && __tryExpression(__currentOffset)) {		success = true;		break _mainLoop;	      } else		tmp = doEvery;	    } else	      tmp = true;	    ++__currentOffset;	  }	  break;	case OpCode._DIGIT:	  while(__currentOffset < endOffset) {	    if(Character.isDigit(__input[__currentOffset])) {	      if(tmp && __tryExpression(__currentOffset)) {		success = true;		break _mainLoop;	      } else		tmp = doEvery;	    } else	      tmp = true;	    ++__currentOffset;	  }	  break;	case OpCode._NDIGIT:	  while(__currentOffset < endOffset) {	    if(!Character.isDigit(__input[__currentOffset])) {	      if(tmp && __tryExpression(__currentOffset)) {		success = true;		break _mainLoop;	      } else		tmp = doEvery;	    } else	      tmp = true;	    ++__currentOffset;	  }	  break;	} // end switch      } else {	if(minLength > 0)	  dontTry = minLength - 1;	endOffset-=dontTry;	do {	  if(__tryExpression(__currentOffset)) {	    success = true;	    break _mainLoop;	  }	} while(__currentOffset++ < endOffset);      }      break _mainLoop;    } // end while    __lastSuccess = success;    __lastMatchResult = null;    return success;  }    private boolean __matchUnicodeClass(char code, char __program[], 			     int offset ,char opcode)  {    boolean isANYOF = ( opcode == OpCode._ANYOFUN );    while( __program[offset] != OpCode._END ){      if( __program[offset] == OpCode._RANGE ){	offset++;	if((code >= __program[offset]) && (code <= __program[offset+1])){	  return isANYOF;	} else {	  offset+=2;	}      } else if(__program[offset] == OpCode._ONECHAR) {       	offset++;	if(__program[offset++] == code) return isANYOF;      } else {	isANYOF = (__program[offset] == OpCode._OPCODE) 	  ? isANYOF : !isANYOF;	offset++;	switch ( __program[offset++] ) {	case OpCode._ALNUM:	  if(OpCode._isWordCharacter(code)) return isANYOF;	  break;	case OpCode._NALNUM:	  if(!OpCode._isWordCharacter(code)) return isANYOF;	  break;	case OpCode._SPACE:	  if(Character.isWhitespace(code)) return isANYOF;	  break;	case OpCode._NSPACE:	  if(!Character.isWhitespace(code)) return isANYOF;	  break;	case OpCode._DIGIT:	  if(Character.isDigit(code)) return isANYOF;	  break;	case OpCode._NDIGIT:	  if(!Character.isDigit(code)) return isANYOF;	  break;	case OpCode._ALNUMC:	  if(Character.isLetterOrDigit(code)) return isANYOF;	  break;	case OpCode._ALPHA:	  if(Character.isLetter(code)) return isANYOF;	  break;	case OpCode._BLANK:	  if(Character.isSpaceChar(code)) return isANYOF;	  break;	case OpCode._CNTRL:	  if(Character.isISOControl(code)) return isANYOF;	  break;	case OpCode._LOWER:	  if(Character.isLowerCase(code)) return isANYOF;	  // Remove this hack after more efficient case-folding and unicode	  // character classes are implemented	  if(__caseInsensitive && Character.isUpperCase(code))	    return isANYOF;	  break;	case OpCode._UPPER:	  if(Character.isUpperCase(code)) return isANYOF;	  // Remove this hack after more efficient case-folding and unicode	  // character classes are implemented	  if(__caseInsensitive && Character.isLowerCase(code))	    return isANYOF;	  break;	case OpCode._PRINT:	  if(Character.isSpaceChar(code)) return isANYOF;          // Fall through to check if the character is alphanumeric,	  // or a punctuation mark.  Printable characters are either	  // alphanumeric, punctuation marks, or spaces.	case OpCode._GRAPH:	  if(Character.isLetterOrDigit(code)) return isANYOF;          // Fall through to check if the character is a punctuation mark.          // Graph characters are either alphanumeric or punctuation.	case OpCode._PUNCT:	  switch ( Character.getType(code) ) {	    case Character.DASH_PUNCTUATION:	    case Character.START_PUNCTUATION:	    case Character.END_PUNCTUATION:	    case Character.CONNECTOR_PUNCTUATION:	    case Character.OTHER_PUNCTUATION:            case Character.MATH_SYMBOL:            case Character.CURRENCY_SYMBOL:            case Character.MODIFIER_SYMBOL:	      return isANYOF;	    default:	      break;	    }	  break;	case OpCode._XDIGIT:	  if( (code >= '0' && code <= '9') ||	      (code >= 'a' && code <= 'f') ||	      (code >= 'A' && code <= 'F')) return isANYOF;	  break;	case OpCode._ASCII:	  if(code < 0x80)return isANYOF;	}      }     }    return !isANYOF;  }    private boolean __tryExpression(int offset) {    int count;        __inputOffset = offset;    __lastParen   = 0;    __expSize     = 0;    if(__numParentheses > 0) {      for(count=0; count <= __numParentheses; count++) {	__beginMatchOffsets[count] = OpCode._NULL_OFFSET;	__endMatchOffsets[count]   = OpCode._NULL_OFFSET;      }    }    if(__match(1)){      __beginMatchOffsets[0] = offset;      __endMatchOffsets[0]   = __inputOffset;      return true;    }    return false;  }      private int __repeat(int offset, int max) {    int scan, eol, operand, ret;    char ch;    char op;    scan = __inputOffset;    eol  = __eol;    if(max != Character.MAX_VALUE && max < eol - scan)      eol = scan + max;    operand = OpCode._getOperand(offset);    switch(op = __program[offset]) {    case OpCode._ANY:      while(scan < eol && __input[scan] != '\n')	++scan;      break;    case OpCode._SANY:      scan = eol;      break;    case OpCode._EXACTLY:      ++operand;      while(scan < eol && __program[operand] == __input[scan])	++scan;      break;    case OpCode._ANYOF:      if(scan < eol && (ch = __input[scan]) < 256) {	while((ch < 256  ) && (__program[operand + (ch >> 4)] & (1 << (ch & 0xf))) == 0) {	  if(++scan < eol)	    ch = __input[scan];	  else	    break;	}      }      break;    case OpCode._ANYOFUN:    case OpCode._NANYOFUN:      if(scan < eol) {	ch = __input[scan];	while(__matchUnicodeClass(ch, __program, operand, op)){	  if(++scan < eol)	    ch = __input[scan];	  else	    break;	}      }      break;    case OpCode._ALNUM:      while(scan < eol && OpCode._isWordCharacter(__input[scan]))	++scan;      break;    case OpCode._NALNUM:      while(scan < eol && !OpCode._isWordCharacter(__input[scan]))	++scan;      break;    case OpCode._SPACE:      while(scan < eol && Character.isWhitespace(__input[scan]))	++scan;      break;    case OpCode._NSPACE:      while(scan < eol && !Character.isWhitespace(__input[scan]))	++scan;      break;    case OpCode._DIGIT:      while(scan < eol && Character.isDigit(__input[scan]))	++scan;      break;    case OpCode._NDIGIT:      while(scan < eol && !Character.isDigit(__input[scan]))	++scan;      break;    default:      break;    }    ret = scan - __inputOffset;    __inputOffset = scan;    return ret;  }  private boolean __match(int offset) {    char nextChar, op;    int scan, next, input, maxScan, current, line, arg;    boolean inputRemains = true, minMod = false;    Perl5Repetition rep;    input    = __inputOffset;    inputRemains = (input < __endOffset);    nextChar = (inputRemains ? __input[input] : __EOS);    scan     = offset;    maxScan  = __program.length;    while(scan < maxScan /*&& scan > 0*/){      next = OpCode._getNext(__program, scan);      switch(op = __program[scan]) {      case OpCode._BOL:	if(input == __bol ? __previousChar == '\n' :	   (__multiline && (inputRemains || input < __eol) && 	    __input[input - 1] == '\n'))	  break;	return false;      case OpCode._MBOL:	if(input == __bol ? __previousChar == '\n' :	   ((inputRemains || input < __eol) && __input[input - 1] == '\n'))	  break;	return false;      case OpCode._SBOL:	if(input == __bol && __previousChar == '\n')	  break;	return false;      case OpCode._GBOL:	if(input == __bol)	  break;	return true;      case OpCode._EOL :	if((inputRemains || input < __eol) && nextChar != '\n')	  return false;	if(!__multiline && __eol - input > 1)	  return false;	break;      case OpCode._MEOL:	if((inputRemains || input < __eol) && nextChar != '\n')	  return false;	break;      case OpCode._SEOL:	if((inputRemains || input < __eol) && nextChar != '\n')	  return false;	if(__eol - input > 1)	  return false;	break;      case OpCode._SANY:	if(!inputRemains && input >= __eol)	  return false;	inputRemains = (++input < __endOffset);	nextChar = (inputRemains ? __input[input] : __EOS);	break;      case OpCode._ANY:	if((!inputRemains && input >= __eol) || nextChar == '\n')	  return false;	inputRemains = (++input < __endOffset);	nextChar = (inputRemains ? __input[input] : __EOS);	break;      case OpCode._EXACTLY:	current = OpCode._getOperand(scan);	line = __program[current++];	if(__program[current] != nextChar)	  return false;	if(__eol - input < line)	  return false;	if(line > 1 && !__compare(__program, current, __input, input, line))	  return false;

⌨️ 快捷键说明

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