How to find in string all matches

c#, regex

Solution

Since you have `.*` at the start and end of your pattern, you only get the whole line match. Besides, `.*` in-between `#`s in your pattern is too greedy, and would grab all the expected matches into 1 match when encountered on a single line.

You may use

var results = Regex.Matches(MyString, "##[^#]*#[^#]*##")
    .Cast<Match>()
    .Select(m => m.Value)
    .ToList();

See the regex demo

NOTE: If there must be at least 1 char in between `##` and `#`, and `#` and `##`, replace `*` quantifier (matching 0+ occurrences) with `+` quantifier (matching 1+ occurrences).

NOTE2: To avoid matches inside `####..#....#####`, you may add lookarounds: `"(?<!#)##[^#]+#[^#]+##(?!#)"`

Pattern details:

- `##` - 2 `#` symbols

- `[^#]*` / `[^#]+` - a negated character class matching 0+ chars (or 1+ chars) other than `#`

- `#` - a single `#`

- `[^#]*` / `[^#]+` - 0+ (or 1+) chars other than `#`

- `##` - double `#` symbol.

BONUS: To get the contents inside `##` and `##`, use a capturing group, a pair of unescaped `(...)` around the part of the pattern you need to extract, and grab `Match.Groups[1].Value`s:

var results = Regex.Matches(MyString, @"##([^#]*#[^#]*)##")
    .Cast<Match>()
    .Select(m => m.Groups[1].Value)
    .ToList();

Problem

Assume that I have the following string: xx##a#11##yyy##bb#2##z Im trying to retrieve all occurrence of `##something#somethingElse##` (In my string I want to have 2 matches: `##a#11##` and `##bb#2##`) I tried to get all matches using ``` Regex.Matches(MyString, ".*(##.*#.*##).*") ``` but it retrieves one match which is the whole row. How can I get all matches from this string? Thanks.

Original source