Regex expression not working in objective c - objective-c

//string
NSString *haystack = #".test {test:test} .test2{dasf:asdF}";
//pattern
NSString *needle = #"[^{}]*{[^{}]*}";
What I want from this is .test {test:test} and .test2{dasf:asdF} in an array (rest of the code handles this) but for some reason this regexp is not working correctly because no results are found.
If
NSString *needle = #"[^{}]*";
I get the following
(
".test ",
"",
"test:test",
"",
" .test2",
"",
"dasf:asdF",
"",
""
)
which is expected. After a lot of fiddling it seems to be a problem with { and } in the regex but I can't think why.
Incidently, if anyone can explain why I get these empty elements in the array above that would be useful to know as well.
Thanks!

Did you try [^{}]+ (with plus) instead of [^{}]*? Just because * matches also zero chars

Would you try using:
NSString *needle = #"[^{}]*\{[^{}]*\}";
indeed, { and } have special meaning in regexs (but they are sort of "automatically" escaped when used within [])

Related

Adding back slash for quotes in Swift

I have the following code in Objective-C:
NSString *someString = #"Hello World";
I need a Swift Code with the following output: \"Hello World\"
Including the double checkmarks and the backslash.
According to your comment, you'll need this:
var mySuperFancyDynamicString: String = "whaaaazzuppp"
let someString: String = "\\\"\(mySuperFancyDynamicString)\\\""
print(someString)
print is \"whaaaazzuppp\" (well... was Hello World, before the edit)
Or to your "text box" Comment:
var mySuperFancyDynamicString: String = textBox.text
let someString: String = "\\\"\(mySuperFancyDynamicString)\\\""
print(someString)
Print will be : \"textBoxContent\"
Apparently you want to convert from Objective-c to swift, if yes then don't add backslash to your double quotes, String in swift are just double quoted text.
You should end with
someString = "Hello World"
If You don't want to convert to swift then what are you doing ? Cause the code you are providing (NSString *someString = #\"Hello World\";) will throw an error.
EDIT :
If you really need that specific output, you must create a string like that :
someString = "\\\"Hello World\\\""

How do I send multiple querystring parameters in ios?

Here is my code
Passing parameters to my Querystring gives me Bad Access Error!
NSString *myJson = #"http://mySite.com/Service.svc/MyList";
myJson = [myJson stringByAppendingFormat:#"?id=%#&uid=%#", firstId, secondId];
Can someone help me out!
What you do here is simple string formatting.
Given what you are doing, I guess firstId & secondId are integers, not objects, so your error is because you don't use the right format.
The format %# in you stringByAppendingFormat is for displaying an object, or more precisely the string returned by its description selector.
If you want to format an integer, just use %d as in C :)
This will give you :
NSString *myJson = #"http://mySite.com/Service.svc/MyList";
myJson = [myJson stringByAppendingFormat:#"?id=%d&uid=%d", firstId, secondId];

trying to add a reassignment to append the special newline character to a string in Obj C

I'm new to C and need to solve what I'm sure is a very simple problem. How do I add a reassignment to append for a newline in Objective C. The hint given was append #"\n". I want my output to appear on a new line. My code is below:
- (IBAction)displaySomeText: (id)sender
{
WonderfulNumber *myWonderfulNumber = [WonderfulNumber wonderfulNumberWithFloat:pi];
NSString *stringToOutput = #"The value is: ";
stringToOutput = [stringToOutput stringByAppendingString:[myWonderfulNumber storedNumberAsString]];
[textView insertText:stringToOutput];
}
Please help
stringToOutput = [stringToOutput stringByAppendingFormat: #"\n%#",[myWonderfulNumber storedNumberAsString]];

Convert quoted strings in a CSV to an NSMutableArray without the quotes

I have a question about the objective C. I have the following NSString *name shown below:
"First Name","Second Name","Last Name";
Actually, name is the header of the CSV and receive from the URL. And I use the follow statement to break the statement to array.
NSMutableArray *csvTitleArray;
csvTitleArray = [[name componentsSeparatedByString:#","];
The result of the array is
[0] = "First Name" // the " is part of the string, it means the first char of [0] is ", not F
[1] = "Second Name"
[2] = "Last Name"
However, I want to cancel the " in the begin and end of the string (the " is part of the string. Can anyone help me? Thank you.
Have a look at parsing csv data, the General CSV section (code example) handles your case.
See writing parser using nsscanner - csv for usefull more generic pointers about parsing data.
Have you thought of using stringByReplacingOccurrencesOfString:withString: and then splitting the string out into an array?

How to filter out some vulnerability causing characters in query string?

I need to filter out characters like /?-^%{}[];$=*`#|&#'\"<>()+,\. I need replace this with empty string if it is there in the query string. Please help me out. I am using this in ASP pages.
Best idea would be to use a function something along the lines of:
Public Function MakeSQLSafe(ByVal sql As String) As String
'first i'd avoid putting quote chars in as they might be valid? just double them up.
Dim strIllegalChars As String = "/?-^%{}[];$=*`#|&#\<>()+,\"
'replace single quotes with double so they don't cause escape character
If sql.Contains("'") Then
sql = sql.Replace("'", "''")
End If
'need to double up double quotes from what I remember to get them through
If sql.Contains("""") Then
sql = sql.Replace("""", """""")
End If
'remove illegal chars
For Each c As Char In strIllegalChars
If sql.Contains(c.ToString) Then
sql = sql.Replace(c.ToString, "")
End If
Next
Return sql
End Function
This hasn't been tested and it could probably be made more efficient, but it should get you going. Wherever you execute your sql in your app, just wrap the sql in this function to clean the string before execution:
ExecuteSQL(MakeSQLSafe(strSQL))
Hope that helps
As with any string sanitisation, you're much better off working with a whitelist that dictates which characters are allowed, rather than a blacklist of characters that aren't.
This question about filtering HTML tags resulted in an accepted answer suggesting the use of a regular expression to match against a whitelist: How do I filter all HTML tags except a certain whitelist? - I suggest you do something very similar.
I'm using URL Routing and I found this works well, pass each part of your URL to this function. It's more than you need as it converts characters like "&" to "and", but you can modify it to suit:
public static string CleanUrl(this string urlpart) {
// convert accented characters to regular ones
string cleaned = urlpart.Trim().anglicized();
// do some pretty conversions
cleaned = Regex.Replace(cleaned, " ", "-");
cleaned = Regex.Replace(cleaned, "#", "no.");
cleaned = Regex.Replace(cleaned, "&", "and");
cleaned = Regex.Replace(cleaned, "%", "percent");
cleaned = Regex.Replace(cleaned, "#", "at");
// strip all illegal characters like punctuation
cleaned = Regex.Replace(cleaned, "[^A-Za-z0-9- ]", "");
// convert spaces to dashes
cleaned = Regex.Replace(cleaned, " +", "-");
// If we're left with nothing after everything is stripped and cleaned
if (cleaned.Length == 0)
cleaned = "no-description";
// return lowercased string
return cleaned.ToLower();
}
// Convert accented characters to standardized ones
private static string anglicized(this string urlpart) {
string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";
string cleaned = urlpart;
for (int i = 0; i < beforeConversion.Length; i++) {
cleaned = Regex.Replace(urlpart, afterConversion[i].ToString(), afterConversion[i].ToString());
}
return cleaned;
// Spanish : ÁÉÍÑÓÚÜ¡¿áéíñóúü"
}