【问题标题】:Catch the setter of some attributes with regex使用正则表达式捕获某些属性的设置器
【发布时间】:2015-08-26 17:14:03
【问题描述】:

我有很多这样定义的类属性:

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

我想将这些声明的设置器转换为示例中的方法

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

【问题讨论】:

  • 在问题中显示正则表达式而不是在场外链接,因为链接可能会中断。

标签: c# python regex


【解决方案1】:

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

[^\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 来确定应该停止匹配的缩进级别。

【讨论】:

  • 感谢您的帮助!!!是的,我做了一些研究,发现人们只是说正则表达式不是最好的工具,那么这种工作最好的工具是什么?顺便说一句,您的正则表达式在我的代码上就像魅力一样工作,它只会在没有 getter 时中断,但这不是问题,因为我 95% 的属性是使用 getter 和 setter 定义的。当 getter 中有非字母字符时,它也会中断,例如:return oRemise.Remise_Remise;并且当 setter 中有乘法或除法时。我通过在括号内添加适当的字符来解决这个问题
【解决方案2】:

虽然这与 C# 无关,但因为您使用的是 python 正则表达式引擎,所以我可以帮助解决问题本身。

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

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

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

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

PS:但是是否希望使用 python 或 Visual Studio 的 Find/Replace? 另外,检查集合内代码括号的语法错误。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
相关资源
最近更新 更多