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



环境:

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; }
}

应用程序中的当前逻辑只需遍历输入的所有正则表达式,在第一个匹配处停止,并在输入中使用该正则表达式的标签。

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

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

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

指定的组可以作为组索引1或组名"groupname"访问。这使得配置更加简单易读。更不用说用许多组修改现有的正则表达式可能会破坏现有的索引和组名,这不是问题。

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

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

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

也许这个CustomLabel可以允许位置占位符,如$1$2,这将表示正则表达式捕获的替换。这是使用regex工具所做的一件非常典型的事情。当您生成输出时,您可以对任何形式为$(d+)的内容执行regex替换,在所需位置使用捕获组。