0

I want to parse a string into something like an array:

ftp://user:pass@host:portpath
ftp://anon:1234@111.222.333.444:9999/path1/path2/

I read the java docs about using Pattern and Matcher but I keep getting an "IllegalStateException: No match found" error.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test {

	public static void main(String[] args) {
		String s = "ftp://anon:bah@111.222.333.444:9999/path1/path2/";
		Pattern p = Pattern.compile("^ftp://(/S+):(/S+)@(/S+):(/d+)(/S+)$");
		Matcher m = p.matcher(s);
		
		for (int i=0; i<m.groupCount(); i++)
			System.out.println("Group"+i+": "+m.group(i));

	}
}

"IllegalStateException: No match found" when it goes to print...

Help would be appreciated. Thnx in adv.

Edited by TheWhite: n/a

2
Contributors
5
Replies
6
Views
7 Years
Discussion Span
Last Post by TheWhite
0

1. Matcher.group() throws IllegalStateException - If no match has yet been attempted, or if the previous match operation failed.
In your case you haven't attempted to match before calling group(). So the exception.
2. If attempted match fails group() still throws IllegalStateExc...
Hope the following clarifies:

package com.kash.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	public static void main(String[] args) {
		String s = "ftp://anon:bah@111.222.333.444:9999/path1/path2/";
		String pattern = "^ftp://(/S+):(/S+)@(/S+):(/d+)(/S+)$";
		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher(s);

		/*
		 * ..call m.matches() or m.lookingAt() or m.find() here..
		 */

		if (m.matches()) {
			for (int i = 0; i < m.groupCount(); i++)
				System.out.println("Group" + i + ": " + m.group(i));
		} else {
			System.out.println("\"" + s + "\" did not match \"" + pattern + "\"");
			System.out.println("so if I call m.group() it'll throw IllegalStateException !");
		}
	}

}
0

I already know the reason no m.group() throws the exception is because no matches were found.

My problem is the pattern which I think should work against that string, but doesn't. Can someone help me figure out the correct pattern?

0
package com.kash.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	public static void main(String[] args) {
		String s = "ftp://anon:bah@111.222.333.444:9999/path1/path2/";
		String pattern = "^ftp://(\\S+):(\\S+)@(\\S+):(\\d+)(\\S+)$";
		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher(s);

		/*
                 * ------------THIS COMMENT IS STILL VALID------------
		 * ..call m.matches() or m.lookingAt() or m.find() here..
		 */

		if (m.matches()) {
			for (int i = 0; i < m.groupCount(); i++)
				System.out.println("Group" + i + ": " + m.group(i));
		} else {
			System.out.println("\"" + s + "\" did not match \"" + pattern + "\"");
			System.out.println("so if I call m.group() it'll throw IllegalStateException !");
		}
	}

}

Output produced:

Group0: ftp://anon:bah@111.222.333.444:9999/path1/path2/
Group1: anon
Group2: bah
Group3: 111.222.333.444
Group4: 9999

Edited by thekashyap: added full code

0

ahhh I should have looked more carefully, slashes were wrong way :).


Also, its missing the last group which should be /path1/path2/ any suggestions on that?

0

It turns out m.groupCount() does not include group 0, so the for loop needs to be bound by m.groupCount() + 1.

Thanks everyone.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.