Skip to content

Commit

Permalink
Fix for stringByReplacingOccurrencesOfString: not working with string…
Browse files Browse the repository at this point in the history
…s that have regex control characters in them.
  • Loading branch information
Ross Boucher committed May 25, 2009
1 parent 25d20df commit 377107d
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
14 changes: 13 additions & 1 deletion Foundation/CPString.j
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ CPNumericSearch = 64;

var CPStringHashes = new objj_dictionary();

var CPStringRegexSpecialCharacters = [
'/', '.', '*', '+', '?', '|', '$', '^',
'(', ')', '[', ']', '{', '}', '\\'
],
CPStringRegexEscapeExpression = new RegExp("(\\" + CPStringRegexSpecialCharacters.join("|\\") + ")", 'g');

/*!
@ingroup foundation
@class CPString
Expand Down Expand Up @@ -359,6 +365,11 @@ var CPStringHashes = new objj_dictionary();

//Replacing Substrings

- (CPString)stringByEscapingRegexControlCharacters
{
return self.replace(CPStringRegexEscapeExpression, "\\$1");
}

/*!
Returns a new string in which all occurrences of a target string in the reciever are replaced by
another given string.
Expand All @@ -368,7 +379,7 @@ var CPStringHashes = new objj_dictionary();

- (CPString)stringByReplacingOccurrencesOfString:(CPString)target withString:(CPString)replacement
{
return self.replace(new RegExp(target, "g"), replacement);
return self.replace(new RegExp([target stringByEscapingRegexControlCharacters], "g"), replacement);
}

/*
Expand All @@ -385,6 +396,7 @@ var CPStringHashes = new objj_dictionary();
var start = substring(0, searchRange.location),
stringSegmentToSearch = substr(searchRange.location, searchRange.length),
end = substring(searchRange.location + searchRange.length, self.length),
target = [target stringByEscapingRegexControlCharacters],
regExp;

if (options & CPCaseInsensitiveSearch)
Expand Down
9 changes: 8 additions & 1 deletion Tests/Foundation/CPStringTest.j
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,16 @@
[self assertTrue:(expectedString === actualString)
message:"stringByAppendingFormat: expected:" + expectedString + " actual:" + actualString];

}

- (void)testStringByReplacingWithRegexCharacters
{
var stringToTest = "${foo} {foo}",
result = [stringToTest stringByReplacingOccurrencesOfString:"${foo}" withString:"BAR"];


[self assert:result equals:"BAR {foo}"];
}

- (void)testStringByAppendingFormat
{
var format = @"%d X %d = %d",
Expand Down

0 comments on commit 377107d

Please sign in to comment.