4

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;
                               }
Billy Korsen
  • 524
  • 2
  • 6
  • 19

4 Answers4

6

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();
}
Vikram
  • 51,313
  • 11
  • 93
  • 122
  • 3
    My understanding of what you said above worked perfect also, I appreciate the explanation as well. Most of the time I just get the answer here. TY – Billy Korsen Jul 30 '14 at 10:11
2

Easiest way is to quote or backslash them:

<string name="random">"?"</string>
<string name="random">\?</string>
Boris Knez
  • 61
  • 2
0

The final code.

String startDelim = ("\\?");
String realDelim = (startDelim);
String[] parts4 = fIdStpOne.split(realDelim);
String  fIdStpTwo= parts4[0];
String JUNK4 = parts4[1];
Billy Korsen
  • 524
  • 2
  • 6
  • 19
-1

Normally you'd just put it literally, like

String q = "?";

However, you say you're using it to split a string. split() takes a regular expression and ? is a metacharacter in a regex. To escape it, add a backslash in front. Backslash is a special character in Java string literals so it needs to be escaped, too:

String q = "\\?";
laalto
  • 150,114
  • 66
  • 286
  • 303
  • I've tried the 2 slashes and it adds a slash to my split that is not there. I logged it to see and //? ends up coming out /? and I need just ?. – Billy Korsen Jul 17 '14 at 09:58
  • If you have problems with the `split()` code, please include it in the question. – laalto Jul 17 '14 at 09:59