Get properties from a .cs class file on disk

.net, c#, regex, vsix

Solution

how to only get the property names of the class.

This pattern is commented, so use `IgnorePatternWhiteSpace` as an option or remove all comments and join onto one line.

But this pattern gets all your data as you provided in the example.

(?>public|internal)     # find public or internal
\s+                     # space(s)
(?!class)               # Stop Match if class
((static|readonly)\s)?  # option static or readonly and space.
(?<Type>[^\s]+)         # Get the type next and put it into the "Type Group"
\s+                     # hard space(s)
(?<Name>[^\s]+)         # Name found.

- Finds six matches (see below).

- Extract the data from named match captures `(?<Named> ...)` such as `mymatch.Groups["Named"].Value` or by the hard integer.

- In this case "Type" and "Name" are the group names or index or with hard ints.

- Will find pattern in commented out sections.

My tool (created for myself) reports these matches and the groups :

Match #0
             [0]:  public string Brand
  ["Type"] → [1]:  string
  ["Name"] → [2]:  Brand

Match #1
             [0]:  internal string YearModel
  ["Type"] → [1]:  string
  ["Name"] → [2]:  YearModel

Match #2
             [0]:  public List<User> HasRented
  ["Type"] → [1]:  List<User>
  ["Name"] → [2]:  HasRented

Match #3
             [0]:  public DateTime? SomeDateTime
  ["Type"] → [1]:  DateTime?
  ["Name"] → [2]:  SomeDateTime

Match #4
             [0]:  public int Amount;
  ["Type"] → [1]:  int
  ["Name"] → [2]:  Amount;

Match #5
             [0]:  public static string Name
  ["Type"] → [1]:  string
  ["Name"] → [2]:  Name

Match #6
             [0]:  public readonly string Address
  ["Type"] → [1]:  string
  ["Name"] → [2]:  Address

Problem

I'm writing a VSIX extension for Visual Studio. With that plugin a user can select a class file from his solution explorer in VS, (so an actual `.cs` file somewhere on disk) and then perform a certain action on that file by triggering my VSIX code through a context menu item. My VSIX extension needs to know what the `public` and `internal` properties are of the selected class file. I'm trying to solve this by using a regex, But I'm kind of stuck with it. I can't figure out how to only get the property names of the class. It finds too much right now. This is the regex I have so far: ``` \s*(?:(?:public|internal)\s+)?(?:static\s+)?(?:readonly\s+)?(\w+)\s+(\w+)\s*[^(] ``` Demo: https://regex101.com/r/ngM5l7/1 From this demo I want to extract all the property names, so: ``` Brand, YearModel, HasRented, SomeDateTime, Amount, Name, Address ``` PS. I know that a regex isn't the best for this kind of job. But I think I don't have any other options from a VSIX extension.

Original source