You need to find a specific occurrence of a match within a string. For example, you want to find the third occurrence of a word or the second occurrence of a Social Security Number. In addition, you may need to find every third occurrence of a word in a string.
To find a particular occurrence of a match
in a string, simply subscript the array returned from
Regex.Matches
:
public static Match FindOccurrenceOf(string source, string pattern, int occurrence) { if (occurrence < 1) { throw (new ArgumentException("Cannot be less than 1", "occurrence")); } // Make occurrence zero-based --occurrence; // Run the regex once on the source string Regex RE = new Regex(pattern, RegexOptions.Multiline); MatchCollection theMatches = RE.Matches(source); if (occurrence >= theMatches.Count) { return (null); } else { return (theMatches[occurrence]); } }
To find each particular occurrence of a match in a string, build an
ArrayList
on the fly:
public static ArrayList FindEachOccurrenceOf(string source, string pattern, int occurrence) { ArrayList occurrences = new ArrayList( ); // Run the regex once on the source string Regex RE = new Regex(pattern, RegexOptions.Multiline); MatchCollection theMatches = RE.Matches(source); for (int index = (occurrence - 1); index < theMatches.Count; index += occurrence) { occurrences.Add(theMatches[index]); } return (occurrences); }
The following method shows how to invoke the two previous methods:
public static void TestOccurrencesOf( ) { Match matchResult = FindOccurrenceOf( "one two three one two three one two three one" + " two three one two three one two three", "two", 2); if (matchResult != null) Console.WriteLine(matchResult.ToString( ) + " " + matchResult.Index); Console.WriteLine( ); ArrayList results = FindEachOccurrenceOf( "one one two three one two three one two" + " three one two three", "one", 2); foreach (Match m in results) Console.WriteLine(m.ToString( ) + " " + m.Index); }
This recipe contains two similar but distinct methods. The first
method, FindOccurrenceOf
, returns a particular
occurrence of a regular expression match. The occurrence you want to
find is passed in to this method via the
occurrence
parameter. If the particular occurrence
of the match does not exist—for example, you ask to find the
second occurrence, but only one occurrence exists—a
null
is returned from this method. Because of
this, you should check that the returned object of this method is not
null
before using that object. If the particular
occurrence exists, the Match
object that holds the
match information for that occurrence is returned.
The second method in this recipe,
FindEachOccurrenceOf
, works similar to the
FindOccurrenceOf
method, except that it continues
to find a particular occurrence of a regular expression match until
the end of the string is reached. For example, if you ask to find the
second occurrence, this method would return an
ArrayList
of zero or more Match
objects. The Match
objects would correspond to the
second, fourth, sixth, and eighth occurrence of a match and so on
until the end of the string is reached.