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

Bil*_*sen 4 regex android escaping

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

我试过了...

strings.xml

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

.class

String questionMark;
questionMark = getResources().getString(R.string.questionMark);
String delim4 = (questionMark);
Run Code Online (Sandbox Code Playgroud)

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

String delim4 = (\?);
Run Code Online (Sandbox Code Playgroud)

这会出现错误无效的转义序列(有效的转义序列是\ b\t \n\f\r \"\\\ \)

并且

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

String delim4 =(\\?)
System.out.println("delim "+ delim4);
Run Code Online (Sandbox Code Playgroud)

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

delim \?

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

请帮助

编辑添加的拆分代码

                               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;
                               }
Run Code Online (Sandbox Code Playgroud)

Vik*_*ram 5

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

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

`?` is not a special character in Java
`?` is a reserved character in regex
Run Code Online (Sandbox Code Playgroud)

这需要:

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

String test = "\?";    // Illegal use of escape character
Run Code Online (Sandbox Code Playgroud)

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

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

回到字符串,我们怎么做\??我们需要逃避\(backslash)-而不是问号!

这是工作流程:

String delim4 = "\\?";
Run Code Online (Sandbox Code Playgroud)

这句话给了我们\?- 它逃脱了\(backslash).

String[] parts4 = fIdStpTwo.split(delim4);
Run Code Online (Sandbox Code Playgroud)

这让我们可以\?split()方法中用作正则表达式.因为delim4正在作为正则表达式传递,\?所以用作?.这里,前缀\用于转义?.


你的观察:

String delim4 = (\?);
Run Code Online (Sandbox Code Playgroud)

这会出现错误无效的转义序列(有效的转义序列是\ b\t \n\f\r \"\\\ \)

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

String delim4 =(\\?)
System.out.println("delim "+ delim4);
Run Code Online (Sandbox Code Playgroud)

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

delim \?

就是我们想要的.将其视为一个两阶段过程更容易.第一阶段处理成功地放在\(backslash)前面?.在第二阶段,正则表达式发现它?已经被a 作为前缀\?用作文字而不是元字符.


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

<string name="questionMark">\\?</string>
Run Code Online (Sandbox Code Playgroud)

顺便说一下,还有另一种选择 - 这些日子我不是经常使用的 - split()工作得很好.

您可以使用StringTokenizer哪些适用于分隔符而不是正则表达式.Afaik,任何文字都可以用作分隔符.所以,您可以?直接使用:

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

while (st.hasMoreTokens()) {
    // Use tokens
    String token = st.nextToken();
}
Run Code Online (Sandbox Code Playgroud)

  • 我对你上面所说的内容的理解也很完美,我也很欣赏这个解释.大多数时候我只是在这里得到答案.TY (3认同)