Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex only capture first match [duplicate]

I want to parse a string using regex, example of the string is

Lot: He said: Thou shalt not pass!

I want to capture Lot as a group, and He said: Thou shalt not pass!. However, when I used my (.+): (.+) pattern, it returns

Lot: He said: and Thou shalt not pass!

Is it possible to capture He said: Thou shalt not pass using regex?

like image 699
Wancak Terakhir Avatar asked Sep 01 '14 09:09

Wancak Terakhir


4 Answers

You need a non-greedy (or lazy) cardinality for the first group: (.+?): (.+).

More details on http://www.regular-expressions.info/repeat.html, chapter "Laziness Instead of Greediness".

like image 70
sp00m Avatar answered Sep 20 '22 15:09

sp00m


give this a try:

([^:]+):\s*(.*)
like image 32
Kent Avatar answered Sep 20 '22 15:09

Kent


(?=.*?:.*?:)(.*?):(.*)

You can use this.

See demo.

http://regex101.com/r/rX0dM7/9

like image 39
vks Avatar answered Sep 18 '22 15:09

vks


You should use the flags ig - i = case insensitive, g = don't return after first match and a expression like "(.:) ?(.: .*)".

You can see example here https://regex101.com/r/SXjg1b/1

like image 41
Matheus Dadalto Avatar answered Sep 20 '22 15:09

Matheus Dadalto