在android中使用问号作为字符串

时间:2014-07-17 09:48:42

标签: android regex escaping

我试图使用问号作为字符串的变量。

我试过......

strings.xml

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

.class

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

这会导致fource关闭正则表达式错误。

String delim4 = (\?);

这会出现错误无效的转义序列(有效的转义序列是\ b \ t \ n \ f \ r \&#34; \&#39; \)

以及

我试过在它前面放两个反斜杠

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

但这只是逃脱了第二次斜线,有时力也会关闭。 那个输出是

delim \?

可以告诉我如何将问号作为字符串。我用它作为变量来吐出一个字符串。 String Im拆分无法更改。

plz help

修改添加的拆分代码

                               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;
                               }

4 个答案:

答案 0 :(得分:5)

正如用户laalto所指出的,?是正则表达式中的元字符。你必须解决这个问题。

让我们看看这里发生了什么。首先,一些基本规则:

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

这需要:

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

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

为什么第二个陈述错了?因为我们试图逃避一个并不特殊的角色(在Java中)。好的,我们会回到这一点。

现在,对于split(String)方法,我们需要转义? - 它是正则表达式中的元字符。因此,我们需要 \? 用于正则表达式

回到字符串,我们如何获得\??我们需要逃离 \(backslash) - 而不是问号!

这是工作流程:

String delim4 = "\\?";

此声明为我们提供了\? - 它逃脱了\(backslash)

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

这允许我们在\?方法中使用split()作为正则表达式。由于delim4作为正则表达式传递, \?用作? 。这里,前缀\用于转义?


您的观察:

String delim4 = (\?);
  

这会出现错误无效的转义序列(有效的转义序列是\ b \ t \ n \ f \ r \&#34; \&#39; \)

我在上面介绍了这一点。您正在java级别转义? - 但它不是一个特殊字符,不需要转义 - 因此错误。

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

但这只是逃脱了第二次斜线,有时力也会关闭。那个输出是

     

delim \?

是我们想要的。将其视为一个两阶段过程更容易。第一阶段处理成功将\(backslash)放在?前面。在第二阶段,正则表达式发现?前缀为\并使用?作为文字而非元字符。


以下是如何将正则表达式放在res / values / strings.xml中的:

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

顺便说一下,还有另一种选择 - 这些日子我没有定期使用 - split()效果很好。

您可以使用StringTokenizer使用分隔符而不是正则表达式。 Afaik,任何文字都可以用作分隔符。因此,您可以直接使用?

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

while (st.hasMoreTokens()) {
    // Use tokens
    String token = st.nextToken();
}

答案 1 :(得分:1)

最简单的方法是引用或反斜杠:

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

答案 2 :(得分:0)

最终代码。

String startDelim = ("\\?");
String realDelim = (startDelim);
String[] parts4 = fIdStpOne.split(realDelim);
String  fIdStpTwo= parts4[0];
String JUNK4 = parts4[1];

答案 3 :(得分:-1)

通常你只是按照字面意思来说,就像

一样
String q = "?";

但是,你说你用它来分割字符串。 split()采用正则表达式,?是正则表达式中的元字符。要逃避它,请在前面添加反斜杠。反斜杠是Java字符串文字中的一个特殊字符,因此它也需要进行转义:

String q = "\\?";