Advertisements
Say I have this string:
111 222 (333 444) 555 666 (777) 888
What I want is:
Group 1: 111 222
Group 2: 333 444
Group 3: 555 666
Group 4: 777
Group 5: 888
I have this regex \(([^\)]+)\)
but it only captures what’s between parens.
>Solution :
You can use
String text = "111 222 (333 444) 555 666 (777) 888";
RegExp rx = new RegExp(r'\(([^()]+)\)|[^()]+');
var values = rx.allMatches(text).map((z) => z.group(1) != null ? z.group(1)?.trim() : z.group(0)?.trim()).toList();
print(values);
// => [111 222, 333 444, 555 666, 777, 888]
See the regex demo. The output is either trimmed Group 1 values, or the whole match values (also trimmed) otherwise. The \(([^()]+)\)|[^()]+
pattern matches a (
, then captures into Group 1 any one or more chars other than parentheses and then matches a )
, or matches one or more chars other than parentheses.
To avoid empty items, you may require at least one non-whitespace:
\(\s*([^\s()][^()]*)\)|[^\s()][^()]*
See this regex demo. Details:
\(
– a(
char\s*
– zero or more whitespaces([^\s()][^()]*)
– Group 1: a char other than whitespace,(
and)
, and then zero or more chars other than round parentheses\)
– a)
char|
– or[^\s()][^()]*
– a char other than whitespace,(
and)
, and then zero or more chars other than round parentheses.