Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using a question mark as a String in android

Im trying to use a question mark as a variable for a string.

I've tried...

strings.xml

<string name="questionMark">\?</string>

.class

String questionMark;
questionMark = getResources().getString(R.string.questionMark);
String delim4 = (questionMark);

This causes a fource close regex error.

and

String delim4 = (\?);

This gets an error Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \ )

and also

I've tried putting 2 backslashes in front of it

String delim4 =(\\?)
System.out.println("delim "+ delim4);

But that just escapes the second slash and sometimes force closes as well. the output for that was

delim \?

Can any tell me how to put in the question mark as the string. I'm using it as variable to spit a string. The String Im splitting can not be changed.

plz help

Edit added split code

                               if (FinishedUrl.contains(questionMark)){ 


                                    String delim3 = (".com/");
                                    String[] parts3 = FinishedUrl.split(delim3);
                                    String  JUNK3= parts3[0];
                                    String fIdStpOne = parts3[1];

                                    String fIdStpTwo = fIdStpOne.replaceAll("=#!/","");

                                    String delim4 = (questionMark);
                                    String[] parts4 = fIdStpTwo.split(delim4);
                                    String  fIdStpThree= parts3[0];
                                    String JUNK4 = parts3[1];


                                    FId = fIdStpThree;
                               }
like image 247
Billy Korsen Avatar asked Mar 20 '23 00:03

Billy Korsen


2 Answers

As pointed out by user laalto, ? is a meta-character in regex. You must work around that.

Let's see what's happening here. Firstly, some ground rules:

`?` is not a special character in Java
`?` is a reserved character in regex

This entails:

String test = "?";     // Valid statement in java, but illegal when used as a regex

String test = "\?";    // Illegal use of escape character

Why is the second statement wrong? Because we are trying to escape a character that isn't special (in Java). Okay, we'll get back to this.

Now, for the split(String) method, we need to escape the ? - it being a meta-character in regex. So, we need \? for the regex.

Coming back to the string, how do we get \?? We need to escape the \(backslash) - not the question mark!

Here's the workflow:

String delim4 = "\\?";

This statement gives us \? - it escapes the \(backslash).

String[] parts4 = fIdStpTwo.split(delim4);

This lets us use \? as a regex in the split() method. Since delim4 is being passed as a regex, \? is used as ?. Here, the prefix \ is used to escape ?.


Your observations:

String delim4 = (\?);

This gets an error Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \ )

I covered this above. You are escaping ? at the java level - but it isn't a special character and needs no escaping - hence the error.

String delim4 =(\\?)
System.out.println("delim "+ delim4);

But that just escapes the second slash and sometimes force closes as well. the output for that was

delim \?

This is what we want. It is easier to think of this as a two stage process. The first stage deals with successfully placing a \(backslash) in front of the ?. In the second stage, regex finds that the ? has been prefixed by a \ and uses ? as a literal instead of a meta-character.


And here's how you can place the regex in your res/values/strings.xml:

<string name="questionMark">\\?</string>

By the way, there's another option - not something I use on a regular basis these days - split() works just fine.

You can use StringTokenizer which works with delimiters instead of regex. Afaik, any literal can be used as a delimiter. So, you can use ? directly:

StringTokenizer st = new StringTokenizer(stringToSplit, "?");

while (st.hasMoreTokens()) {
    // Use tokens
    String token = st.nextToken();
}
like image 147
Vikram Avatar answered Mar 29 '23 02:03

Vikram


Easiest way is to quote or backslash them:

<string name="random">"?"</string>
<string name="random">\?</string>
like image 44
Boris Knez Avatar answered Mar 29 '23 02:03

Boris Knez