使用正则表达式获取 C# 文件字段和属性

Get C# file fields and properties using regular expression

提问人:Moonderland 提问时间:6/12/2023 最后编辑:InSyncMoonderland 更新时间:6/12/2023 访问量:68

问:

我想使用正则表达式匹配(从 .cs 文件中选择)属性名称、字段名称和使用它们的位置。

这是示例类:

using System;
... // usings
using Grpc.Net.Client;
using UI = Gtk.Builder.ObjectAttribute;

namespace DummyProject;

public class MainWindow : Window
{
    [UI] private readonly MenuItem _aboutMenuItem;
    [UI] private readonly MenuItem _openFolderItem;
    [UI] private readonly MenuItem _openFileItem;
    [UI] private readonly Viewport _fileViewport;
    [UI] private readonly Notebook _codeNotebook;
    private readonly SourceView _codeSourceView;
    private readonly FileViewer _fileViewer;
    private readonly Files.FilesClient _filesClient;
    
    public FileSystemViewer FileSystemViewer { get; }
    
    public MainWindow() 
    {
        _fileViewer = new FileViewer();
        // some code
    }

    // methods

结果将是:、、、、、_aboutMenuItem_openFolderItem_openFileItem_fileViewport_codeNotebook_codeSourceView_fileViewer_filesClientFileSystemViewer

我试过这个正则表达式:^(?:(?=[^()]*$))?(?:(?!.*\b(namespace|return|using|class)\b))[\t \b]*(?:[\[\]a-zA-Z0-9_.]+\s+)?(?:(?:private|public|protected|internal)\s+)?(?:(?:static readonly|static|const|readonly|volatile|virtual|override)\s+)?(?:(?:[a-zA-Z0-9\.]+)\s+)?(\w+)\s*

但是这个正则表达式匹配不正确(参见 https://regex101.com/r/ZbctGa/3)

有什么建议吗?

C# .NET 正则表达式

评论

2赞 InSync 6/12/2023
这听起来像是一个 XY 问题。为什么要用正则表达式解析不规则语言?
2赞 Thomas Weller 6/12/2023
正则表达式在这里不是正确的选择。使用 C# 分析器。查看 Roslyn。
0赞 Charlieface 6/12/2023
为什么不编译它并使用反射提取信息呢?
0赞 Moonderland 6/12/2023
@ThomasWeller非常感谢您的提示,我认为解决我问题的方法恰恰在于使用 Roslyn 而不是正则表达式
0赞 Moonderland 6/13/2023
@InSync感谢您的评论,我正在开发一个面向 dotnet/csharp 的代码编辑器,我认为可以使用正则表达式实现语法突出显示(即使用正则表达式找到正确的文本片段并突出显示它),但 ThomasWeller 给了我一个提示,这个问题应该用 Roslyn 来解决

答:

1赞 Reilas 6/12/2023 #1

您可以使用以下命令来捕获属性字段

(?:public|private)(?! class) (?:readonly )?(?:.+?) (.+?)[ ;]

输出

_aboutMenuItem
_openFolderItem
_openFileItem
_fileViewport
_codeNotebook
_codeSourceView
_fileViewer
_filesClient
FileSystemViewer

评论

0赞 M H 6/12/2023
是否有理由使用文字空格而不是 or ? 在这种模式中,我们将处理源代码中不同作品/属性等之间的额外空格。\s\s+(?:public|private)(?!\s+class)\s+(?:readonly\s+)?(?:.+?)\s+(.+?)[\s+;]