CFLib.org – Common Function Library Project

stringFind(pattern, string[, all][, start][, caseSensitive])

Last updated September 29, 2012

author

Adam Cameron

Version: 1 | Requires: CF9 | Library: StrLib

Description:
stringFind() is a melding of reFind() and reMatch(). It returns the match as well as all sub-expression matches as pos and len values (similar to reFind()), as well as the substring that the pos & len values refer to (like reMatch()). Finds one or all matches. This is similar to existing CFLib functions, preg_match_all() and reFindAll(), but more-closely matches its native counterparts.

Return Values:
An array of structs, similar to reFind() when set to return subexpressions.

Example:

string = "This is a string that has words of differing lengths, and I'm gonna use stringFind() to return the words that are five or six characters long";
pattern = "\b(\w{5,6})\b";
result = stringFind(pattern, string, true, 1, false);
writeDump(result);

Parameters:

Name Description Required
pattern A regular expression to match. Yes
string A string to find matches in. Yes
all Whether to match one (default) or all matches. No
start The position in the string to start looking for matches. No
caseSensitive Whether to do a case-sensitive or case-insensitive (default) match. No

Full UDF Source:

/**
 * Returns matched substrings and subexpressions from a string based on a regular expression pattern
 * v1.0 by Adam Cameron
 * 
 * @param pattern 	 A regular expression to match. (Required)
 * @param string 	 A string to find matches in. (Required)
 * @param all 	 Whether to match one (default) or all matches. (Optional)
 * @param start 	 The position in the string to start looking for matches. (Optional)
 * @param caseSensitive 	 Whether to do a case-sensitive or case-insensitive (default) match. (Optional)
 * @return An array of structs, similar to reFind() when set to return subexpressions. 
 * @author Adam Cameron (adamcameroncoldfusion@gmail.com) 
 * @version 1.0, September 29, 2012 
 */
array function stringFind(required string pattern, required string string, boolean all=false, numeric start=1, boolean caseSensitive=false){
	var result	= [];
	var matches	= [];
	var i		= 0;
	var match	= "";

	do {
		if (caseSensitive){
			matches = reFind(pattern, string, start, true);
		}else{
			matches = reFindNoCase(pattern, string, start, true);
		}
		// if we have a match, we need to extract the matched strings too
		if (matches.pos[1]){
			matches.string = [];
			for (i=1; i <= arrayLen(matches.pos); i++){
				if (matches.len[i]){
					match = mid(string, matches.pos[i], matches.len[i]);
				}else{
					match = "";
				}
				arrayAppend(matches.string, match);
			}
			arrayAppend(result, matches);
			// if we were only after one match: we're done...
			if (!all){
				break;
			}
			// ... otherwise shimmy along to after this match, ready to look for the next one
			start = matches.pos[1] + matches.len[1];
		}
	} while(matches.pos[1]);
	return result;
}
blog comments powered by Disqus

Search CFLib.org


Latest Additions

Kevin Cotton added
date2ExcelDate
May 5, 2016

Raymond Camden added
CapFirst
April 25, 2016

Chris Wigginton added
loremIpsum
January 18, 2016

Gary Stanton added
calculateArrival...
November 19, 2015

Sebastiaan Naafs - van Dijk added
getDaysInQuarter
November 13, 2015

Created by Raymond Camden / Design by Justin Johnson