user2492270
user2492270

Reputation: 2285

Java Regular Expression (greedy/nongreedy)

So I'm trying to separate the following two groups formatted as:

FIRST - GrouP              second.group.txt

The first group can contain any character The second group is a dot(.) delimited string.

I'm using the following regex to separate these two groups:

([A-Z].+).*?([a-z]+\.[a-z]+)

However, it gives a wrong result:

1: FIRST - GrouP second.grou
2: p.txt

I don't understand because I'm using "nongreedy" separater (.*?) instead of the greedy one (. *)

What am I doing wrong here?

Thanks

Upvotes: 0

Views: 76

Answers (2)

lintmouse
lintmouse

Reputation: 5119

This is one possible solution that should be pretty compact:

(.*?-\s*\S+)|(\S+\.?)+

https://regex101.com/r/iW8mE5/1

It is looking for anything followed by a dash, zero or more spaces, and then non-whitespace characters. And if it doesn't find that, it looks for non-whitespace followed by an optional decimal.

Upvotes: 0

anubhava
anubhava

Reputation: 785156

You can this regex to match both groups:

\b([A-Z].+?)\s*\b([a-z]+(?:\.[a-z]+)+)\b

RegEx Demo

Breakup:

\b               # word boundary
([A-Z].+?)       # match [A-Z] followed by 1 or more chars (lazy)
\s*              # match 0 or more spaces
\b               # word boundary
([a-z]+          # match 1 or more of [a-z] chars
(?:\.[a-z]+)+)   # match a group of dot followed by 1 or more [a-z] chars
\b               # word boundary

PS: (?:..) is used for non-capturing group.

Upvotes: 2

Related Questions