了解.net中编译的正则表达式

时间:2011-05-09 12:47:51

标签: .net regex

我有一个重复使用的正则表达式,其中stringLiteral从一次调用到下一次调用会有所不同。

一个人:

.*(^stringLiteral Number 1\r?\n)([\w|\s][^\r\n]+)(.+)

而下一个是:

.*(^stringLiteral Number 2\r?\n)([\w|\s][^\r\n]+)(.+)

这里有优化的机会吗?

编辑:要更加明确我正在使用的实时数据 - 我正在解析一个包含名称/值对的电子邮件。我知道名称(标签),我知道我之后的值是标签后面的行。但我不能确定名称/值对(行)将始终以相同的顺序 - 所以我不能构建一个大的表达式。

我必须构建多个表达式,从块的开头到包括给定标签(这将是stringLiteral)的所有内容都丢弃;将下一行捕获到捕获组中;然后丢弃该行之后的所有内容。

所以此行捕获名称字段

myOrder.Name = Regex.Replace(resultString, @".*(^Name\r\n)([\w|\s][^\r\n]+)(.+)", "$2", RegexOptions.Multiline | RegexOptions.Singleline);

此行捕获价格字段

myOrder.Price= Regex.Replace(resultString, @".*(^Price\r\n)([\w|\s][^\r\n]+)(.+)", "$2", RegexOptions.Multiline | RegexOptions.Singleline);

2 个答案:

答案 0 :(得分:2)

好吧,如果你想要,你可以将它们压缩成一个表达式:

  

.(^stringLiteral Number [12]\r?\n)([\w|\s][^\r\n]+)(.+)

如果您发布了想要匹配或捕获的输入示例,我可能会提供更多帮助。

答案 1 :(得分:0)

您可以按照Andrew的建议将它们压缩成单个表达式。

您还应该禁用不需要的回溯,例如:(?:subregexp)而不是(subregexp)。这样做可以节省内存。