Class StringSearch
StringSearch is a SearchIterator that provides language-sensitive text searching
based on the comparison rules defined in a RuleBasedCollator object. StringSearch ensures
that language eccentricity can be handled, e.g. for the German collator, characters ß and
SS will be matched if case is chosen to be ignored. See the
"ICU Collation Design Document" for more information.
There are 2 match options for selection:
Let S' be the sub-string of a text string S between the offsets start and end [start, end].
A pattern string P matches a text string S at the offsets [start, end] if
option 1. Some canonical equivalent of P matches some canonical equivalent
of S'
option 2. P matches S' and if P starts or ends with a combining mark,
there exists no non-ignorable combining mark before or after S?
in S respectively.
Option 2. is the default.
This search has APIs similar to that of other text iteration mechanisms such as the break
iterators in BreakIterator. Using these APIs, it is easy to scan through text looking for
all occurrences of a given pattern. This search iterator allows changing of direction by calling
a reset() followed by a SearchIterator.next() or SearchIterator.previous(). Though a direction change can
occur without calling reset() first, this operation comes with some speed penalty. Match
results in the forward direction will match the result matches in the backwards direction in the
reverse order
SearchIterator provides APIs to specify the starting position within the text string
to be searched, e.g. setIndex, preceding and following. Since the starting position will be
set as it is specified, please take note that there are some danger points at which the search
may render incorrect results:
- In the midst of a substring that requires normalization.
- If the following match is to be found, the position should not be the second character which requires swapping with the preceding character. Vice versa, if the preceding match is to be found, the position to search from should not be the first character which requires swapping with the next character. E.g certain Thai and Lao characters require swapping.
- If a following pattern match is to be found, any position within a contracting sequence except the first will fail. Vice versa if a preceding pattern match is to be found, an invalid starting point would be any character within a contracting sequence except the last.
A BreakIterator can be used if only matches at logical breaks are desired. Using a
BreakIterator will only give you results that exactly matches the boundaries given by the
BreakIterator. For instance the pattern "e" will not be found in the string "é" if a
character break iterator is used.
Options are provided to handle overlapping matches. E.g. In English, overlapping matches produces the result 0 and 2 for the pattern "abab" in the text "ababab", where mutually exclusive matches only produces the result of 0.
Options are also provided to implement "asymmetric search" as described in UTS #10 Unicode Collation Algorithm, specifically the ElementComparisonType values.
Though collator attributes will be taken into consideration while performing matches, there
are no APIs here for setting and getting the attributes. These attributes can be set by getting
the collator from getCollator() and using the APIs in RuleBasedCollator. Lastly to
update StringSearch to the new collator attributes, reset() has to be called.
Restriction:
Currently there are no composite characters that consists of a character with combining class
> 0 before a character with combining class == 0. However, if such a character exists in the
future, StringSearch does not guarantee the results for option 1.
Consult the SearchIterator documentation for information on and examples of how to use
instances of this class to implement text searching.
Note, StringSearch is not to be subclassed.
- Author:
- Laura Werner, synwee
- See Also:
- Status:
- Stable ICU 2.0.
-
Nested Class Summary
Nested classes/interfaces inherited from class SearchIterator
SearchIterator.ElementComparisonTypeModifier and TypeClassDescriptionstatic enumOption to control how collation elements are compared. -
Field Summary
Fields inherited from class SearchIterator
breakIterator, DONE, matchLength, targetTextModifier and TypeFieldDescriptionprotected BreakIteratorThe BreakIterator to define the boundaries of a logical match.static final intDONE is returned by previous() and next() after all valid matches have been returned, and by first() and last() if there are no matches at all.protected intLength of the most current match in target text.protected CharacterIteratorTarget text for searching. -
Constructor Summary
ConstructorsConstructorDescriptionStringSearch(String pattern, String target) Initializes the iterator to use the language-specific rules and break iterator rules defined in the default locale to search for argument pattern in the argument target text.StringSearch(String pattern, CharacterIterator target, RuleBasedCollator collator) Initializes the iterator to use the language-specific rules defined in the argument collator to search for argument pattern in the argument target text.StringSearch(String pattern, CharacterIterator target, RuleBasedCollator collator, BreakIterator breakiter) Initializes the iterator to use the language-specific rules defined in the argument collator to search for argument pattern in the argument target text.StringSearch(String pattern, CharacterIterator target, ULocale locale) Initializes the iterator to use the language-specific rules and break iterator rules defined in the argument locale to search for argument pattern in the argument target text.StringSearch(String pattern, CharacterIterator target, Locale locale) Initializes the iterator to use the language-specific rules and break iterator rules defined in the argument locale to search for argument pattern in the argument target text. -
Method Summary
Modifier and TypeMethodDescriptionGets theRuleBasedCollatorused for the language rules.intgetIndex()Return the current index in the text being searched.Returns the pattern for whichStringSearchis searching for.protected inthandleNext(int position) Abstract method which subclasses override to provide the mechanism for finding the next match in the target text.protected inthandlePrevious(int position) Abstract method which subclasses override to provide the mechanism for finding the previous match in the target text.booleanDetermines whether canonical matches (option 1, as described in the class documentation) is set.voidreset()Resets the iteration.voidsetCanonical(boolean allowCanonical) Set the canonical match mode.voidsetCollator(RuleBasedCollator collator) Sets theRuleBasedCollatorto be used for language-specific searching.voidsetIndex(int position) Sets the position in the target text at which the next search will start.protected voidDeprecated.This API is ICU internal only.voidsetPattern(String pattern) Set the pattern to search for.voidsetTarget(CharacterIterator text) Set the target text to be searched.Methods inherited from class SearchIterator
first, following, getBreakIterator, getElementComparisonType, getMatchedText, getMatchLength, getMatchStart, getTarget, isOverlapping, last, next, preceding, previous, setBreakIterator, setElementComparisonType, setMatchLength, setOverlappingModifier and TypeMethodDescriptionfinal intfirst()Returns the first index at which the string text matches the search pattern.final intfollowing(int position) Returns the first index equal or greater thanpositionat which the string text matches the search pattern.Returns the BreakIterator that is used to restrict the indexes at which matches are detected.Returns the collation element comparison type.Returns the text that was matched by the most recent call toSearchIterator.first(),SearchIterator.next(),SearchIterator.previous(), orSearchIterator.last().intReturns the length of text in the string which matches the search pattern.intReturns the index to the match in the text string that was searched.Return the string text to be searched.booleanReturn true if the overlapping property has been set.final intlast()Returns the last index in the target text at which it matches the search pattern.intnext()Returns the index of the next point at which the text matches the search pattern, starting from the current position The iterator is adjusted so that its current index (as returned bySearchIterator.getIndex()) is the match position if one was found.final intpreceding(int position) Returns the first index less thanpositionat which the string text matches the search pattern.intprevious()Returns the index of the previous point at which the string text matches the search pattern, starting at the current position.voidsetBreakIterator(BreakIterator breakiter) Set the BreakIterator that will be used to restrict the points at which matches are detected.voidSets the collation element comparison type.protected voidsetMatchLength(int length) Sets the length of the most recent match in the target text.voidsetOverlapping(boolean allowOverlap) Determines whether overlapping matches are returned.
-
Constructor Details
-
StringSearch
public StringSearch(String pattern, CharacterIterator target, RuleBasedCollator collator, BreakIterator breakiter) Initializes the iterator to use the language-specific rules defined in the argument collator to search for argument pattern in the argument target text. The argumentbreakiteris used to define logical matches. See super class documentation for more details on the use of the target text andBreakIterator.- Parameters:
pattern- text to look for.target- target text to search for pattern.collator-RuleBasedCollatorthat defines the language rulesbreakiter- ABreakIteratorthat is used to determine the boundaries of a logical match. This argument can be null.- Throws:
IllegalArgumentException- thrown when argument target is null, or of length 0- See Also:
- Status:
- Stable ICU 2.0.
-
StringSearch
Initializes the iterator to use the language-specific rules defined in the argument collator to search for argument pattern in the argument target text. NoBreakIterators are set to test for logical matches.- Parameters:
pattern- text to look for.target- target text to search for pattern.collator-RuleBasedCollatorthat defines the language rules- Throws:
IllegalArgumentException- thrown when argument target is null, or of length 0- See Also:
- Status:
- Stable ICU 2.0.
-
StringSearch
Initializes the iterator to use the language-specific rules and break iterator rules defined in the argument locale to search for argument pattern in the argument target text.- Parameters:
pattern- text to look for.target- target text to search for pattern.locale- locale to use for language and break iterator rules- Throws:
IllegalArgumentException- thrown when argument target is null, or of length 0. ClassCastException thrown if the collator for the specified locale is not a RuleBasedCollator.- Status:
- Stable ICU 2.0.
-
StringSearch
Initializes the iterator to use the language-specific rules and break iterator rules defined in the argument locale to search for argument pattern in the argument target text. See super class documentation for more details on the use of the target text andBreakIterator.- Parameters:
pattern- text to look for.target- target text to search for pattern.locale- locale to use for language and break iterator rules- Throws:
IllegalArgumentException- thrown when argument target is null, or of length 0. ClassCastException thrown if the collator for the specified locale is not a RuleBasedCollator.- See Also:
- Status:
- Stable ICU 3.2.
-
StringSearch
Initializes the iterator to use the language-specific rules and break iterator rules defined in the default locale to search for argument pattern in the argument target text.- Parameters:
pattern- text to look for.target- target text to search for pattern.- Throws:
IllegalArgumentException- thrown when argument target is null, or of length 0. ClassCastException thrown if the collator for the default locale is not a RuleBasedCollator.- Status:
- Stable ICU 2.0.
-
-
Method Details
-
getCollator
Gets theRuleBasedCollatorused for the language rules.Since
StringSearchdepends on the returnedRuleBasedCollator, any changes to theRuleBasedCollatorresult should follow with a call to eitherreset()orsetCollator(RuleBasedCollator)to ensure the correct search behavior.- Returns:
RuleBasedCollatorused by thisStringSearch- See Also:
- Status:
- Stable ICU 2.0.
-
setCollator
Sets theRuleBasedCollatorto be used for language-specific searching.The iterator's position will not be changed by this method.
- Parameters:
collator- to use for thisStringSearch- Throws:
IllegalArgumentException- thrown when collator is null- See Also:
- Status:
- Stable ICU 2.0.
-
getPattern
Returns the pattern for whichStringSearchis searching for.- Returns:
- the pattern searched for
- Status:
- Stable ICU 2.0.
-
setPattern
Set the pattern to search for. The iterator's position will not be changed by this method.- Parameters:
pattern- for searching- Throws:
IllegalArgumentException- thrown if pattern is null or of length 0- See Also:
- Status:
- Stable ICU 2.0.
-
isCanonical
public boolean isCanonical()Determines whether canonical matches (option 1, as described in the class documentation) is set. See setCanonical(boolean) for more information.- Returns:
- true if canonical matches is set, false otherwise
- See Also:
- Status:
- Stable ICU 2.8.
-
setCanonical
public void setCanonical(boolean allowCanonical) Set the canonical match mode. See class documentation for details. The default setting for this property is false.- Parameters:
allowCanonical- flag indicator if canonical matches are allowed- See Also:
- Status:
- Stable ICU 2.8.
-
setTarget
Set the target text to be searched. Text iteration will then begin at the start of the text string. This method is useful if you want to reuse an iterator to search within a different body of text.- Overrides:
setTargetin classSearchIterator- Parameters:
text- new text iterator to look for match,- See Also:
- Status:
- Stable ICU 2.8.
-
getIndex
public int getIndex()Return the current index in the text being searched. If the iteration has gone past the end of the text (or past the beginning for a backwards search),SearchIterator.DONEis returned.- Specified by:
getIndexin classSearchIterator- Returns:
- current index in the text being searched.
- Status:
- Stable ICU 2.8.
-
setIndex
public void setIndex(int position) Sets the position in the target text at which the next search will start. This method clears any previous match.- Overrides:
setIndexin classSearchIterator- Parameters:
position- position from which to start the next search- See Also:
- Status:
- Stable ICU 2.8.
-
reset
public void reset()Resets the iteration. Search will begin at the start of the text string if a forward iteration is initiated before a backwards iteration. Otherwise if a backwards iteration is initiated before a forwards iteration, the search will begin at the end of the text string.- Overrides:
resetin classSearchIterator- Status:
- Stable ICU 2.8.
-
handleNext
protected int handleNext(int position) Abstract method which subclasses override to provide the mechanism for finding the next match in the target text. This allows different subclasses to provide different search algorithms.If a match is found, the implementation should return the index at which the match starts and should call
SearchIterator.setMatchLength(int)with the number of characters in the target text that make up the match. If no match is found, the method should returnSearchIterator.DONE.- Specified by:
handleNextin classSearchIterator- Parameters:
position- The index in the target text at which the search should start.- Returns:
- index at which the match starts, else if match is not found
SearchIterator.DONEis returned - See Also:
- Status:
- Stable ICU 2.8.
-
handlePrevious
protected int handlePrevious(int position) Abstract method which subclasses override to provide the mechanism for finding the previous match in the target text. This allows different subclasses to provide different search algorithms.If a match is found, the implementation should return the index at which the match starts and should call
SearchIterator.setMatchLength(int)with the number of characters in the target text that make up the match. If no match is found, the method should returnSearchIterator.DONE.- Specified by:
handlePreviousin classSearchIterator- Parameters:
position- The index in the target text at which the search should start.- Returns:
- index at which the match starts, else if match is not found
SearchIterator.DONEis returned - See Also:
- Status:
- Stable ICU 2.8.
-
setMatchNotFound
Deprecated.This API is ICU internal only.- Overrides:
setMatchNotFoundin classSearchIterator- Status:
- Internal. This API is ICU internal only.
-