If you have several substrings that you need inside a larger string, you can use capture groups.
To get the per part, use the following regex and take Groups[2].Value :
var str = "my text has $1 per Lap to someone. "; var per_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[2].Value;
Output:

The re-expression for capturing per is \p{L}+ , where \p{L} captures all Unicode letters (for example, , ), and not just the Latin script.
To get the part number, use the same regular expression, but take Groups[1].Value :
var num_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[1].Value;
Output:

And one more tip: compile your regular expression if you plan to use it several times during the execution of your application:
var rx = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)", RegexOptions.Compiled); var per_str = rx.Match(str).Groups[2].Value; var num_str = rx.Match(str).Groups[1].Value;
If you just want the number after $ , just put the opening parenthesis after it in the regular expression: @"\$(\d+(?:\.\d+)?)\s*(\p{L}+)" .
And to get all the groups in 1, you can use
var groups = rx.Matches(str).Cast<Match>().Select(p => new { num = p.Groups[1].Value, per = p.Groups[2].Value }).ToList();

EDIT:
If you just want to match per after the number, you can use @"(\$\d+(?:\.\d+)?)\s*(per)" or (case insensitive) @"(\$\d+(?:\.\d+)?)\s*((?i:per\b))"