// =========================================================================== // CONTENT : CLASS StringExaminer // AUTHOR : Manfred Duchrow // VERSION : 1.0 - 29/09/2002 // HISTORY : // 29/09/2002 duma CREATED // // Copyright (c) 2002, by Manfred Duchrow. All rights reserved. // =========================================================================== package org.pf.text ; // =========================================================================== // IMPORTS // =========================================================================== /** * As a subclass of StringScanner this class allows more advanced navigation * over the underlying string. <br> * That includes moving to positions of specific substrings etc. * * @author Manfred Duchrow * @version 1.0 */ public class StringExaminer extends StringScanner { // ========================================================================= // CONSTANTS // ========================================================================= // ========================================================================= // INSTANCE VARIABLES // ========================================================================= private boolean ignoreCase = false ; protected boolean ignoreCase() { return ignoreCase ; } protected void ignoreCase( boolean newValue ) { ignoreCase = newValue ; } // ========================================================================= // CLASS METHODS // ========================================================================= // ========================================================================= // CONSTRUCTORS // ========================================================================= /** * Initialize the new instance with the string to examine. <br> * The string will be treated case-sensitive. * * @param stringToExamine The string that should be examined */ public StringExaminer( String stringToExamine ) { this( stringToExamine, false ) ; } // StringExaminer() // ------------------------------------------------------------------------- /** * Initialize the new instance with the string to examine. * * @param stringToExamine The string that should be examined * @param ignoreCase Specified whether or not treating the string case insensitive */ public StringExaminer( String stringToExamine, boolean ignoreCase ) { super( stringToExamine ) ; this.ignoreCase( ignoreCase ) ; } // StringExaminer() // ------------------------------------------------------------------------- // ========================================================================= // PUBLIC INSTANCE METHODS // ========================================================================= /** * Increments the position pointer up to the last character that matched * the character sequence in the given matchString. * Returns true, if the matchString was found, otherwise false. * <p> * If the matchString was found, the next invocation of method nextChar() * returns the first character after that matchString. * * @param matchString The string to look up */ public boolean skipAfter( String matchString ) { char ch = '-' ; char matchChar = ' ' ; boolean found = false ; int index = 0 ; if ( ( matchString == null ) || ( matchString.length() == 0 ) ) return false ; ch = this.nextChar() ; while ( ( endNotReached( ch ) ) && ( ! found ) ) { matchChar = matchString.charAt( index ) ; if ( this.charsAreEqual( ch, matchChar ) ) { index++ ; if ( index >= matchString.length() ) // whole matchString checked ? { found = true ; } else { ch = this.nextChar() ; } } else { if ( index == 0 ) { ch = this.nextChar() ; } else { index = 0 ; } } } return found ; } // skipAfter() // ------------------------------------------------------------------------- /** * Increments the position pointer up to the first character before * the character sequence in the given matchString. * Returns true, if the matchString was found, otherwise false. * <p> * If the matchString was found, the next invocation of method nextChar() * returns the first character of that matchString from the position where * it was found inside the examined string. * * @param matchString The string to look up */ public boolean skipBefore( String matchString ) { boolean found ; found = this.skipAfter( matchString ) ; if ( found ) this.skip( 0 - matchString.length() ) ; return found ; } // skipBefore() // ------------------------------------------------------------------------- /** * Returns the a string containing all characters from the current position * up to the end of the examined string. <br> * The character position of the examiner is not changed by this * method. */ public String peekUpToEnd() { return this.upToEnd( true ) ; } // peekUpToEnd() // ------------------------------------------------------------------------- /** * Returns the a string containing all characters from the current position * up to the end of the examined string. <br> * The character position is put to the end by this method. * That means the next invocation of nextChar() returns END_REACHED. */ public String upToEnd() { return this.upToEnd( false ) ; } // upToEnd() // ------------------------------------------------------------------------- // ========================================================================= // PROTECTED INSTANCE METHODS // ========================================================================= protected boolean charsAreEqual( char char1, char char2) { return ( this.ignoreCase() ) ? ( Character.toUpperCase(char1) == Character.toUpperCase( char2 ) ) : ( char1 == char2 ) ; } // charsAreEqual() // ------------------------------------------------------------------------- /** * Returns the a string containing all characters from the current position * up to the end of the examined string. <br> * Depending on the peek flag the character position of the examiner * is unchanged (true) after calling this method or points behind the strings * last character. */ protected String upToEnd( boolean peek ) { char result = '-' ; int lastPosition = 0 ; StringBuffer buffer = new StringBuffer( 100 ) ; lastPosition = this.getPosition() ; result = this.nextChar() ; while ( endNotReached( result ) ) { buffer.append( result ) ; result = this.nextChar() ; } if ( peek ) this.setPosition( lastPosition ) ; return buffer.toString() ; } // upToEnd() // ------------------------------------------------------------------------- } // class StringExaminer