如何允许用户组合外部字符串和正则表达式捕获值?

时间:2014-02-26 18:49:36

标签: c# .net regex

环境:

C#.Net 4.0,VS2010。

背景:

我有一个通过网络读取数据并将其转换为xml的应用程序。然后,其他下游用户应用程序将此xml数据用于各种目的。

以前,有些用户要求添加一个设置,允许他们使用正则表达式匹配,通过自定义字符串替换数据中的某些字符串。然后将其内置到应用程序中

问题:

现在有一个新请求,用户不仅希望使用自定义字符串,还希望将其与正则表达式中匹配的一部分结合起来。

我知道我们可以使用匹配,组和捕获来执行此操作,但如何从设置中配置它?

目前我使用类似下面的类来管理自定义标签及其正则表达式

[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public class CustomSettingsGroup
{
    [SettingsSerializeAs(SettingsSerializeAs.Xml)]
    public class CustomSetting
    {
        public string CustomLabel { get; set; }
        public string RegularExpression { get; set; }
    }

    public List<CustomSetting> CustomSettingCollection { get; set; }
}

应用程序中的当前逻辑简单地覆盖输入的所有正则表达式,在第一个匹配处停止,并在输入中使用该正则表达式的标签。

2 个答案:

答案 0 :(得分:1)

也许这个CustomLabel可以允许位置占位符,例如$1$2,它们代表正则表达式捕获的替换。这是与regex工具相关的典型事情。生成输出时,可以对\$(\d+)形式的任何内容进行正则表达式替换,并将捕获组放在所需位置。

答案 1 :(得分:1)

我非常同意雅各布的想法,我只是想给出一个更详细的答案。我在过去做了很多次类似的配置,很容易。

有一件重要的事情:在正则表达式组捕获的情况下,支持正则表达式组名称是一种非常好的做法!例如,在这个正则表达式的情况下:

 @"^blahblah(?<groupname>\d+)blahblah$" 

指定的组可以作为组索引1或组名“groupname”进行访问。这导致更容易和可读的配置。更不用说修改现有的正则表达式可以搞砸现有的索引和组名,这不是问题。

您仍需要的是格式化程序函数,它接收格式字符串作为参数以及正则表达式匹配对象(包含组值)。这就是我通常定义格式字符串的格式:

    格式字符串中的
  • $$转换为格式化字符串中的单个$
  • $0$1,... $N${0}${1},... ${N}转化为价值指定索引处的正则表达式组
  • $groupname${groupname}转换为具有指定名称的正则表达式组的值

我通常在格式字符串中处理/接受${xyz}表单,因为如果没有这个,你就无法处理类似以下格式字符串的情况:Score: ${score}000 如果没有{},格式字符串将为Score: $score000,因此您可以将格式字符串中的组名称解析为score000