Input:
Hi. I am John.
My name is John. Who are you ?
Output:
Hi
I am John
My name is John
Who are you
Input:
Hi. I am John.
My name is John. Who are you ?
Output:
Hi
I am John
My name is John
Who are you
String line = "Hi. My name is John. Who are you ?";
String[] sentences = line.split("(?<=[.!?])\\s+");
for (String sentence : sentences) {
System.out.println("[" + sentence + "]");
}
This produces:
[Hi.]
[My name is John.]
[Who are you ?]
If you're not comfortable using split
(even though it's the recommended replacement for the "legacy" java.util.StringTokenizer
), you can just use only java.util.Scanner
(which is more than adequate to do the job).
Here's a solution that uses Scanner
, which by the way implements Iterator<String>
. For extra instructional value, I'm also showing an example of using java.lang.Iterable<T>
so that you can use the for-each construct.
final String text =
"Hi. I am John.\n" +
"My name is John. Who are you ?";
Iterable<String> sentences = new Iterable<String>() {
@Override public Iterator<String> iterator() {
return new Scanner(text).useDelimiter("\\s*[.!?]\\s*");
}
};
for (String sentence : sentences) {
System.out.println("[" + sentence + "]");
}
This prints:
[Hi]
[I am John]
[My name is John]
[Who are you]
If this regex is still not what you want, then I recommend investing the time to educate yourself so you can take matters into your own hand.
Note: the final
modifier for the local variable text
in the above snippet is a necessity. In an illustrative example, it makes for a concise code, but in your actual code you should refactor the anonymous class to its own named class and have it take text
in the constructor.