Java: scanning string for a pattern

java, java.util.scanner

Solution

`hasNext(String pattern)` only returns `true` if the next token matches the pattern. In your case, `"asda"` is the next token, and that does NOT match `"[A-Z]+"`. The documentation is clear in that "[the] scanner does not advance past any input".

If you change the pattern to `"[A-Za-z]+"`, then you'd get three tokens, which may be what you intended.

If in fact you only want to get tokens that match `"[A-Z]+"`, then you can do any of the following:

- simply discard non-matching tokens

- `useDelimiter("[^A-Z]+")`, then simply invoke `next()`

- use `skip("[^A-Z]+")`

- use `findInLine("[A-Z]+")`

Tip: if performance is critical, you'd want to use the precompiled `Pattern` overloads of these methods.

Tip: do keep in mind that`"Xooo ABC"` has two `"[A-Z]+"` matches. If this is not what you want, then the regex will have to be a bit more complicated. Or you can always simply discard non-matching tokens.

Problem

This is probably a quicky. Why does this code not return anything? ``` import java.util.Scanner; public class MainClass { public static void main(String[] args) { try { Scanner sc = new Scanner("asda ASA adad"); String pattern = "[A-Z]+"; while ((sc.hasNext(pattern))) { System.out.println(sc.next(pattern)); } sc.close(); } catch (Exception e) { e.printStackTrace(); } } } ```

Original source