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; }
}
应用程序中的当前逻辑简单地覆盖输入的所有正则表达式,在第一个匹配处停止,并在输入中使用该正则表达式的标签。
答案 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
。