嘿我想用下划线替换随机字母(只有第一个).为此,我使用以下行:
String newSubstring=substring.replaceFirst(randomLetter,"_");
Run Code Online (Sandbox Code Playgroud)
这种方法很好,除非有一个括号"("或")".然后我得到以下异常:
06-14 15:29:48.090: E/AndroidRuntime(12466): FATAL EXCEPTION: main
06-14 15:29:48.090: E/AndroidRuntime(12466): Process: com.clozegenerator, PID: 12466
06-14 15:29:48.090: E/AndroidRuntime(12466): java.util.regex.PatternSyntaxException: Incorrectly nested parentheses in regexp pattern near index 1:
06-14 15:29:48.090: E/AndroidRuntime(12466): )
06-14 15:29:48.090: E/AndroidRuntime(12466): ^
06-14 15:29:48.090: E/AndroidRuntime(12466): at java.util.regex.Pattern.compileImpl(Native Method)
06-14 15:29:48.090: E/AndroidRuntime(12466): at java.util.regex.Pattern.compile(Pattern.java:411)
06-14 15:29:48.090: E/AndroidRuntime(12466): at java.util.regex.Pattern.<init>(Pattern.java:394)
06-14 15:29:48.090: E/AndroidRuntime(12466): at java.util.regex.Pattern.compile(Pattern.java:381)
06-14 15:29:48.090: E/AndroidRuntime(12466): at java.lang.String.replaceFirst(String.java:1804)
06-14 15:29:48.090: E/AndroidRuntime(12466): at com.clozegenerator.MainActivity.generateCloze(MainActivity.java:138)
06-14 15:29:48.090: E/AndroidRuntime(12466): at com.clozegenerator.MainActivity.onClick(MainActivity.java:113)
06-14 15:29:48.090: E/AndroidRuntime(12466): at android.view.View.performClick(View.java:4480)
06-14 15:29:48.090: E/AndroidRuntime(12466): at android.view.View$PerformClick.run(View.java:18673)
06-14 15:29:48.090: E/AndroidRuntime(12466): at android.os.Handler.handleCallback(Handler.java:733)
06-14 15:29:48.090: E/AndroidRuntime(12466): at android.os.Handler.dispatchMessage(Handler.java:95)
06-14 15:29:48.090: E/AndroidRuntime(12466): at android.os.Looper.loop(Looper.java:157)
06-14 15:29:48.090: E/AndroidRuntime(12466): at android.app.ActivityThread.main(ActivityThread.java:5872)
06-14 15:29:48.090: E/AndroidRuntime(12466): at java.lang.reflect.Method.invokeNative(Native Method)
06-14 15:29:48.090: E/AndroidRuntime(12466): at java.lang.reflect.Method.invoke(Method.java:515)
06-14 15:29:48.090: E/AndroidRuntime(12466): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1069)
06-14 15:29:48.090: E/AndroidRuntime(12466): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)
06-14 15:29:48.090: E/AndroidRuntime(12466): at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我有什么想法可以解决这个问题?
replaceFirst
使用正则表达式作为第一个参数和正则表达式(
并且)
是特殊的(例如它们打开和关闭组)所以你需要使用例如它们来转义它们\\(
或者用\\Q
\\E
它们来表示引用.
但为了避免手动转义它们,您可以使用Pattern.quote
类似的方法
String newSubstring=substring.replaceFirst(Pattern.quote(randomLetter),"_");
Run Code Online (Sandbox Code Playgroud)