从磁盘

时间:2017-05-06 20:54:05

标签: c# .net regex vsix

我正在为Visual Studio编写VSIX扩展。使用该插件,用户可以从VS中的解决方案资源管理器中选择一个类文件(因此磁盘上的某个实际.cs文件)然后通过上下文菜单项触发我的VSIX代码对该文件执行某个操作

我的VSIX扩展程序需要知道所选类文件的publicinternal属性。

我试图通过使用正则表达式解决这个问题,但我有点坚持它。我无法弄清楚如何只获取类的属性名称。它现在发现太多了。

这是我到目前为止的正则表达式:

\s*(?:(?:public|internal)\s+)?(?:static\s+)?(?:readonly\s+)?(\w+)\s+(\w+)\s*[^(]

演示:https://regex101.com/r/ngM5l7/1 从这个演示中我想提取所有的属性名称,所以:

Brand,
YearModel,
HasRented,
SomeDateTime,
Amount,
Name,
Address

PS。我知道正则表达式不适合这种工作。但我认为我没有VSIX扩展中的任何其他选项。

1 个答案:

答案 0 :(得分:3)

  

如何只获取该类的属性名称。

此模式已注释,因此请使用IgnorePatternWhiteSpace作为选项或删除所有注释并加入一行。

但是这种模式可以像您在示例中提供的一样获取所有数据。

(?>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.
  1. 找到六场比赛(见下文)。
  2. 从命名匹配捕获(?<Named> ...)(例如mymatch.Groups["Named"].Value)或硬整数中提取数据。
  3. 在这种情况下&#34; Type&#34;和&#34;姓名&#34;是组名称或索引或具有强制的int。
  4. 将在注释掉的部分中找到模式。
  5. 我的工具(为自己创建)报告了这些匹配和组:

    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