Remove "?" from NSString IOS - ios

I am trying to remove all symbols from a string, it works fine with below code for all symbols except "?".
NSString *newString = self.titleString;
NSArray *characters = #[#"<", #"!", #"#", #"#", #"$", #"%", #"^", #"&", #"*", #"(", #")", #",", #"_", #"+", #"|", #">", #"?", #" "];
for (NSString *str in characters) {
newString = [newString stringByReplacingOccurrencesOfString:str withString:#""];
}

You can use stringByReplacingOccurrencesOfString with the regular expression option, NSRegularExpressionSearch:
NSString *output = [input stringByReplacingOccurrencesOfString:#"[<>!##$%^&*(),_+?| ]" withString:#"" options:NSRegularExpressionSearch range:NSMakeRange(0, [input length])];
You can also take advantage of other regular expression features, e.g. replace all non-letter characters:
NSString *output = [input stringByReplacingOccurrencesOfString:#"\\P{L}" withString:#"" options:NSRegularExpressionSearch range:NSMakeRange(0, [input length])];
or not A-Z:
NSString *output = [input stringByReplacingOccurrencesOfString:#"[^a-zA-Z]" withString:#"" options:NSRegularExpressionSearch range:NSMakeRange(0, [input length])];
It just depends upon precisely what you're trying to achieve.

You can remove all characters in a single call using NSRegularExpression:
NSString *string = self.titleString;
NSError *error = nil;
// Prepare the regular expression that matches any of your characters
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:#"[<>!##$%^&*(),_+?| ]"
options:NSRegularExpressionCaseInsensitive
error:&error];
// Replace all matches with an empty string
string = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:#""];

You have to escape the ? like that: "\?". Otherwise it won't work properly. ? only means in regex stands for 0 or 1 occurences and so you have to say to objective-c that it is a real char you want to test.

If this is for editing user text you might want to consider using a union of more than one NSCharacterSet - this will help it be more language-friendly when you localize/internationalize your app.
NSString *myInputText = #"asd;jkfhals#$%^%$&1asldiguhd";
NSCharacterSet *nonAlphanumeric = [[NSMutableCharacterSet alphanumericCharacterSet] invert];
NSArray *parts = [myInputText componentsSeparatedByCharactersInSet:nonAlphanumeric];
NSArray *mySafeOutputText = [parts componentsJoinedByString:#""];
It's a little non-intuitive to use the components method, but unfortunately Apple doesn't provide a stringByReplacingCharactersInSet: method. :(

Related

iOS: extract substring of NSString in objective C

I have an NSString as:
"<a href='javascript:void(null)' onclick='handleCommandForAnchor(this, 10);return false;'>12321<\/a>"
I need to extract the 12321 near the end of the NSString from it and store.
First I tried
NSString *shipNumHtml=[mValues objectAtIndex:1];
NSInteger htmlLen=[shipNumHtml length];
NSString *shipNum=[[shipNumHtml substringFromIndex:htmlLen-12]substringToIndex:8];
But then I found out that number 12321 can be of variable length.
I can't find a method like java's indexOf() to find the '>' and '<' and then find substring with those indices. All the answers I've found on SO either know what substring to search for or know the location if the substring. Any help?
I don't usually advocate using Regular expressions for parsing HTML contents but it seems a regex matching >(\d+)< would to the job in this simple string.
Here is a simple example:
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:#">(\\d+)<"
options:0
error:&error];
// Handle error != nil
NSTextCheckingResult *match = [regex firstMatchInString:string
options:0
range:NSMakeRange(0, [string length])];
if (match) {
NSRange matchRange = [match rangeAtIndex:1];
NSString *number = [string substringWithRange:matchRange]
NSLog(#"Number: %#", number);
}
As #HaneTV says, you can use the NSString method rangeOfString to search for substrings. Given that the characters ">" and "<" appear in multiple places in your string, so you might want to take a look at NSRegularExpression and/or NSScanner.
that may help on you a bit, I've just tested:
NSString *_string = #"<a href='javascript:void(null)' onclick='handleCommandForAnchor(this, 10);return false;'>12321</a>";
NSError *_error;
NSRegularExpression *_regExp = [NSRegularExpression regularExpressionWithPattern:#">(.*)<" options:NSRegularExpressionCaseInsensitive error:&_error];
NSArray *_matchesInString = [_regExp matchesInString:_string options:NSMatchingReportCompletion range:NSMakeRange(0, _string.length)];
[_matchesInString enumerateObjectsUsingBlock:^(NSTextCheckingResult * result, NSUInteger idx, BOOL *stop) {
for (int i = 0; i < result.numberOfRanges; i++) {
NSString *_match = [_string substringWithRange:[result rangeAtIndex:i]];
NSLog(#"%#", _match);
}
}];

how to replace many occurrences of comma by single comma

Earlier I had string as 1,2,3,,5,6,7
To replace string, I used stringByReplacingOccurrencesOfString:#",," withString:#",", which gives output as 1,2,3,5,6,7
Now I have string as below.
1,2,3,,,6,7
To replace string, I used stringByReplacingOccurrencesOfString:#",," withString:#",", which gives output as 1,2,3,,6,7
Is there way where I can replace all double comma by single comma.
I know I can do it using for loop or while loop, but I want to check is there any other way?
for (int j=1;j<=100;j++) {
stringByReplacingOccurrencesOfString:#",," withString:#","]]
}
NSString *string = #"1,2,3,,,6,7";
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:#",{2,}" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:#","];
NSLog(#"%#", modifiedString);
This will match any number of , present in the string. It's future proof :)
Not the perfect solution, but what about this
NSString *string = #"1,2,3,,,6,7";
NSMutableArray *array =[[string componentsSeparatedByString:#","] mutableCopy];
[array removeObject:#""];
NSLog(#"%#",[array componentsJoinedByString:#","]);

NSString Substring detection

I need help with replacing occurrences of string with another string. Occurrency that needs to be detected is actually some kind of function:
%nx+a or %nx-a
where x and a are some numbers.
So for example %n10+2 or %n54-11.
I can't even use something like:
NSRange startRange = [snippetString rangeOfString:#"%n"];
because if I have two patterns within same string I'm checking I'll only get starting range of first one...
Thanks.
For something like this you could use an NSRegularExpression and use the method enumerateMatches:.
Or you can create your own loop.
The first is the easiest once you have the correct pattern.
Something like...
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:#"%n" options:0 error:nil];
NSString *string = #"%n10+2*%n2";
[regex enumerateMatchesInString:string
options:0
range:NSMakeRange(0, string.length)
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
// here you will get each instance of a match to the pattern
}];
You will have to check the docs for NSRegularExpression to learn how to do what work you need to do with this.
Docs... https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html
I assume that you need to do something with those two numbers. I think the best way is to use a regular expression to extract what you need in one go.
NSString * string = #"some %n5-3 string %n11+98";
NSError * regexError = nil;
NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:#"%n(\\d+)([+-])(\\d+)"
options:0
error:&regexError];
NSArray * matches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)];
for (NSTextCheckingResult * match in matches) {
NSString * firstNumber = [string substringWithRange:[match rangeAtIndex:1]];
NSString * secondNumber = [string substringWithRange:[match rangeAtIndex:3]];
NSString * sign = [string substringWithRange:[match rangeAtIndex:2]];
// Do something useful with the numbers.
}
Of course if you just need to replace all the %n occurences with a constant string you can do that in one call:
NSString * result = [string stringByReplacingOccurrencesOfString:#"%n\\d+[+-]\\d+"
withString:#"here be dragons"
options:NSRegularExpressionSearch
range:NSMakeRange(0, string.length)];
Disclaimer: I didn't test this code. Minor bugs may be present.
Alter this code to match ur need
yourString = [yourString stringByReplacingOccurrencesOfString:#" +" withString:#" "options:NSRegularExpressionSearch range:NSMakeRange(0, yourString.length)];

stringByReplacingOccurrencesOfString function

I am new to ios development.
NSString *newString2 = [aString stringByReplacingOccurrencesOfString:#"1," withString:#""];
My problem is i do not know how to check for any number i.e. stringByReplacingOccurrencesOfString:#"anyInt," where any Int is any integer number from 1 to N.
Thanks in advance!
Using regular expressions is the best solution:
NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:#"[1-9]" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:#""];
Check official NSRegularExpression documentation, there is also a good tutorial here
A regular expression is probably the easiest solution. Whether you want to remove just single digits or multiple digits, a regular expression can help.
NSString *aString = #"Apple 10, Banana 3, Carrot 5, Durian 42, Eggplant 4,";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:#"[0-9]+," options:0 error:NULL];
NSString *newString = [regex stringByReplacingMatchesInString:aString options:0 range:NSMakeRange(0, [aString length]) withTemplate:#""];
NSLog(#"%#", newString);
// result should be "Apple Banana Carrot Durian Eggplant "
Regular expressions may seem overwhelming or difficult to understand at first, but it is only because they can be very powerful for searching and replacing text. Have a look at the overview section of the NSRegularExpression documentation for more information.
For nos in first part greater than 0, second part is shown. For 0 in first part, -- is shown.
Try the below code,
NSString * aString = #"1,10";
NSString *newString2;
NSArray *items = [aString componentsSeparatedByString:#","];
if([[items objectAtIndex:0] integerValue]>0)
newString2 = [items objectAtIndex:1];
else
newString2 = #"--";
Just these two lines to remove all numbers from a string.
NSCharacterSet *numbers = [NSCharacterSet
characterSetWithCharactersInString:#"0123456789"];
NSString *newString = [[tempstr componentsSeparatedByCharactersInSet: numbers] componentsJoinedByString:#""];
If you want to check the range and then you want to replace then use below api:-
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement
why you want to check the existence of the Integer because ultimate you'll replace it with ''. So just use the below line
NSString *newString2 = [aString stringByReplacingOccurrencesOfString:[NSString StringWithFormat:#"%d", anyInt], withString:#""];
Above line will fulfill your requirement.

Using RegEx to remove text between brackets

I am developing an iOS app and need to remove all text between brackets from a string, including the brackets. Example: "Look at this image [960x640]" should be "Look at this image"
My code works fine if there's only one set of brackets, but if there's multiple, it only removes the first set.
+ (NSString *)stringWithoutBrackets:(NSString *)input{
NSString *expression = #"\\[[\\w]+\\]";
while ([input rangeOfString:expression options:NSRegularExpressionSearch|NSCaseInsensitiveSearch].location!=NSNotFound){
input = [input stringByReplacingOccurrencesOfString:expression withString:#"" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch range:NSMakeRange(0, [input length])];
}
return input;
}
Try using the NSRegularExpression class.
NSError *error;
NSMutableString *string = [NSMutableString stringWithString:#"Look at this image [960x640] and [somethingelse]"];
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:#"\\\[[\\\w]+\\\]" options:0 error:&error];
[regularExpression replaceMatchesInString:string options:0 range:NSMakeRange(0, string.length) withTemplate:#""];
NSLog(#"String %#", string);
Prints:Look at this image and

Resources