正则表达式从表单结果返回值

时间:2013-02-07 16:36:18

标签: c# regex

Web表单的结果通过文本邮件发送给我,我需要解析它的所有值。我想要一个正则表达式,它能够返回给定键的结果。

String Pattern = String.Format("^.*{0}:\s*(?<mail><mailto\:)?(.*)(?(mail)>)\s*$", InputString);

我启用了这两个选项:RegexOptions.IgnoreCase | RegexOptions.Multiline

以下是需要解析的文本的一部分。

City:     Test City
Country:  Mycountry

Phone:    212
Fax:      
E-Mail:   <mailto:mymail@example.com>

除了没有价值的情况,例如,这是有效的。 Fax。如果我将Fax作为InputString,则返回完整的下一行E-Mail: <mailto:mymail@example.com>。我想要没有结果或空洞。

2 个答案:

答案 0 :(得分:1)

您的问题在于,即使您未使用RegexOptions.SingleLine因此.\n不匹配,\s字符类也会匹配\n

您可以通过将\s的每个实例替换为[^\S\r\n]来解决此问题,即匹配“空格(包括换行符)”,匹配“not(非空格或换行符)”。 / p>

string pattern = String.Format(
    @"^[^\S\r\n]*{0}:[^\S\r\n]*(?<mail><mailto\:)?(.*)(?(mail)>)[^\S\r\n]*$",
    "Fax");

然而,您还有其他问题:RegexOptions.Multiline表示^$\n匹配,因此您将留下尾随{{}如果您的匹配中的换行符为\r,则匹配您的匹配。

要解决此问题,您可以使用\r\n,而是将RegexOptions.Multiline替换为^,将(?<=^|\r\n)替换为$ },手动匹配(?=$|\r\n)换行符。

答案 1 :(得分:0)

这是一个模式和代码,用于将项目放入字典中进行提取。如果该值为空,则其键在字典中有效,但该ke包含或返回的值为null。

string data = @"City: Test City
Country: Mycountry
Phone: 212
Fax:
E-Mail: <mailto:mymail@example.com>";

string pattern = @"^(?<Key>[^:]+)(?::)(?<Value>.*)";

var resultDictionary =

Regex.Matches(data, pattern, RegexOptions.Multiline)
     .OfType<Match>()
     .ToDictionary (mt => mt.Groups["Key"].Value, mt => mt.Groups["Value"].Value);

/* resultDictionary is a dictionary with these values:

City      Test City
Country   Mycountry
Phone     212
Fax
E-Mail  <mailto:mymail@example.com>
*/