Fix for stringByReplacingOccurrencesOfString: not working with strings that have regex control characters in them.

This commit is contained in:
Ross Boucher
2009-05-25 16:12:27 -07:00
parent 25d20df5f3
commit 377107d63a
2 changed files with 22 additions and 3 deletions
+13 -1
View File
@@ -58,6 +58,12 @@ CPNumericSearch = 64;
var CPStringHashes = new objj_dictionary();
var CPStringRegexSpecialCharacters = [
'/', '.', '*', '+', '?', '|', '$', '^',
'(', ')', '[', ']', '{', '}', '\\'
],
CPStringRegexEscapeExpression = new RegExp("(\\" + CPStringRegexSpecialCharacters.join("|\\") + ")", 'g');
/*!
@ingroup foundation
@class CPString
@@ -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.
@@ -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);
}
/*
@@ -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)
+9 -2
View File
@@ -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",