Chebz
Chebz

Reputation: 1395

Regex: how to extract function parameters

I could not find similar question with what I am trying to get at.

I have a function:

Foo(int n, str b, Bar1(), Bar2(smth));

I am trying to write regex to get the following matches:

int n
str b
Bar()
Bar2(smth) // don't need recursion

I've managed to do it in 2 separate regexes:

(?<=\().*(?=\))

to get:

int n, str b, Bar1(), Bar2(smth)

then on that string, I 've used:

[^,\s*][a-zA-Z\s<>.()0-9]*

to get:

int n
str b
Bar()
Bar2(smth)

But I would really like to do it in a single regex statement, is it possible to somehow capture first regex in a group and then run second regex on that group in a single statement? I am still quite vague on using groups.

Upvotes: 0

Views: 423

Answers (3)

Alexey
Alexey

Reputation: 2479

Try this one

((?<=\(|,\s)((\w+\s)+\w+)|(\w+\((\w+(\,\s){0,1})*\)))

Check demo https://regex101.com/r/Bv1Y5L/1

Upvotes: 0

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626691

You can use

(?:\G(?!^)\s*,\s*|\()\K\w+(?:\s+\w+|\s*\([^()]*\))

See the regex demo. Details:

  • (?:\G(?!^)\s*,\s*|\() - either the end of the preceding match and then a comma enclosed with zero or more whitespaces, or a ( char
  • \K - omit the text matched so far
  • \w+ - one or more word chars
  • (?:\s+\w+|\s*\([^()]*\)) - a non-capturing group matching one of two alternatives
    • \s+\w+ - one or more whitespaces and then one or more word chars
    • | - or
    • \s* - zero or more whitespaces
    • \([^()]*\) - a ( char, then zero or more chars other than ( and ) and then a ) char.

Upvotes: 0

Tim Biegeleisen
Tim Biegeleisen

Reputation: 520878

For the function call you happened to post, the following regex seems to work:

(?:\w+ \w+|\w+\(\w*\))

This pattern matches, alternatively, a type followed by variable name, or a function name, with optional parameters. Here is a working demo.

Upvotes: 1

Related Questions