使用正则表达式捕获一些属性的setter

时间:2015-08-25 15:37:33

标签: c# python regex

我有很多以这种方式定义的类属性:

public string ContreMarque
{
    get
    {
        return sContreMarque;
    }
    set
    {
        // bloc of code
    }
}

我想将thoses声明的setter转换为类似示例的方法

partial void onContremarqueChanged(string value)
{
    // bloc of code
}

我创建了一个正则表达式来为我做这个工作但是当有一个只有getter的公共属性时它会中断。您可以查看此链接中完成的工作:https://regex101.com/r/dN3dJ8/5

以下是链接断开时的正则表达式:

"\spublic (.+) (.+)\s+\{\s+get[\{\sa-z;\}]+set\s+\{\s+([a-z\s+=\(\);_0-9."\{\}/,!?]+)\t\t\t\}"mi

2 个答案:

答案 0 :(得分:0)

虽然这与C#无关,但由于你使用的是python regex引擎,我可以帮助解决这个问题。

在你的原始正则表达式中,你是说get只有一个返回,但可以有任何括号:

get[\{\sa-z;\}]+)set

最简单的方法是强制括号仅在获取逻辑之外:

get\s+\{[\sa-z;]+)\s+\}\s+set

PS:但是希望使用python或Visual Studio的查找/替换? 另外,检查集合中代码括号的语法错误。

答案 1 :(得分:0)

我认为正则表达式不是最好的工具,但如果你想这样做,试试这个怪物:

[^\n]+public\s(?P<type>.+?)\s(?P<name>.+?)\n+(?P<indent>\s+)\{\s+get\s+\{\s+(?P<get>[\sa-z;\}]+?)\s*\}(?:\s+set\s+\{\s+(?P<set>[a-z\s+=\(\);_0-9."\{\}/,!?]+?)\s+\})?(?=\n(?P=indent)\})\s+\}

DEMO on your example with Python engine

但是只有保持干净的缩进才能完成这项工作!没有它它会破裂。它将匹配的相关部分放在命名组中:typenamegetset。它还使用命名组indent来确定它应该停止匹配的缩进级别。