我正在使用多行文本,通常是html,我需要扫描包含动态子字符串(snippet code
)的特定字符串(field name
)。此子字符串将用作查找数据和替换整个初始字符串的参数。
初始字符串:${config[" DYNAMIC STRING HERE "]}
这里的想法是创建填充了这些代码段的模板页面,并在呈现页面时,使用配置工具中的相应值替换代码段。
在下面的代码中,args.FieldValue
是需要解析的文本。目前,我正在使用可在下面找到的正则表达式@"\${config\[\""(?<fieldName>.*)\""\]}"
。这应该将匹配值放在fieldName
组中。
代码:
// Group all of the field names in the config group.
var matchCollection = Regex.Matches(args.FieldValue, @"\${config\[\""(?<fieldName>.*)\""\]}");
// If there are matches, process them.
if (matchCollection.Count > 0)
{
// Takes the field names from the collection and converts them to snippet objects.
List<Snippet> snippets = GetSnippetsFromField(args, matchCollection);
// Replaces all of the snippet codes with values from the config tool.
RenderSnippets(ref args, snippets);
}
示例字符串:
"Lorem ipsum dolor sit ${config["First Name"]}, consectetur adipiscing ${config["Title"]}, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
${config["First Name"]} ${config["Last Name"]} sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
就目前而言,当一行上有一个代码段代码时,正则表达式可以正常工作。但是当有多个时,它会抓住第一个${config["
nad "]}
之间的所有文本。这是由于.*
肯定的,我只需要检查[A-Za-z]和空格,但是对于我的生活,我无法找到任何匹配,当我尝试或任何我能在SO上找到的其他变体。
非常感谢任何和所有帮助。
答案 0 :(得分:1)
*
是greedy运营商。因此,.*
将尽可能多地匹配,并仍然允许正则表达式的其余部分匹配。我建议使用否定的字符类:
@"\${config\[""(?<fieldName>[^""]*)""]}"
否定字符类[^"]
匹配除"
以外的任何字符(零次或多次)
答案 1 :(得分:1)
您声明您知道字段名称只是字母和空格。所以这是另一个选择:
@"\${config\[""(?<fieldName>[a-z ]*)""\]}"
注意:使用 RegexOptions.IgnoreCase 选项
另一个注意事项:你不需要在正则表达式中转义引号 - 它们不是特殊字符。
如果它没有那么具体,你可以使用@hwnd和@PhilippeLeybaert建议的一般模式之一:[^"]*
或.*?
。