Force regex closure!

I am having a problem with the following bit of code. I am trying to match a string. When I have a match, everything works fine. When it does not find a match, it throws an exception and causes a force closure.


Code snippet

private void validatePhoneNumberFormat(String t){ Pattern p = Pattern.compile("^Match this exactly!$"); Matcher m = p.matcher(t); m.find(); if (m.group(0) != ""){ this.myString = m.group(0); this.setIsValid(true); this.setStatus(0); } else { this.myString = "Invalid Input String"; this.setIsValid(false); this.setStatus(99); // String parsing error } } 

Logcat

 02-17 14:12:10.562: WARN/dalvikvm(3854): threadid=1: thread exiting with uncaught exception (group=0x40015560) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): FATAL EXCEPTION: main 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): java.lang.IllegalStateException: No successful match so far 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at java.util.regex.Matcher.ensureMatch(Matcher.java:607) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at java.util.regex.Matcher.group(Matcher.java:358) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at com.android.example.RegExTest.MyList.validateMyStringFormat(MyList.java:47) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at com.android.example.RegExTest.MyList.<init>(MyList.java:15) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at com.android.example.RegExTest.DataManagerActivity.readInputFile(DataManagerActivity.java:128) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at com.android.example.RegExTest.DataManagerActivity$2.onClick(DataManagerActivity.java:77) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at android.view.View.performClick(View.java:2485) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at android.view.View$PerformClick.run(View.java:9080) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at android.os.Handler.handleCallback(Handler.java:587) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at android.os.Handler.dispatchMessage(Handler.java:92) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at android.os.Looper.loop(Looper.java:123) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at android.app.ActivityThread.main(ActivityThread.java:3647) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at java.lang.reflect.Method.invokeNative(Native Method) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at java.lang.reflect.Method.invoke(Method.java:507) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 02-17 14:12:11.322: ERROR/AndroidRuntime(3854): at dalvik.system.NativeStart.main(Native Method) 02-17 14:12:11.402: WARN/ActivityManager(62): Force finishing activity com.android.example.RegExTest/.DataManagerActivity 
+6
android regex validation
source share
3 answers

Try matching instead:

 if (m.matches()){ 

instead:

 if (m.group(0) != ""){ 
+11
source share

The http://download.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#find () method find returns true if and only if a match is found. Therefore, before you call, you must make sure that matches are found.

 if (m.find()) { // do other stuff } 
+3
source share

This behaves as documented. You can catch the exception, rather than checking for an empty string.

+1
source share

All Articles