3

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

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. 如果我将FaxInputString 作为输入,则将返回完整的下一行E-Mail: <mailto:mymail@example.com>。我想要没有结果或空的。

4

2 回答 2

1

你的问题是,即使你没有使用RegexOptions.SingleLine,因此.不匹配\n\s字符类确实匹配\n

您可以通过替换\swith的每个实例来解决此问题[^\S\r\n],即不匹配“空格(包括换行符)”,而是匹配“非(非空格或换行符)”。

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

但是,您会遇到另一个问题:RegexOptions.Multiline表示^$匹配 a \n,因此\r如果匹配中的换行符是\r\n.

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

于 2013-02-08T08:41:40.227 回答
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>
*/
于 2013-02-07T18:59:13.760 回答