Regex从表单结果返回值

本文关键字:返回值 结果 表单 Regex | 更新日期: 2023-09-27 17:58:07

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>。我希望要么没有结果,要么一个空结果。

Regex从表单结果返回值

您的问题是,即使您没有使用RegexOptions.SingleLine,因此.'n不匹配,'s字符类也与'n匹配。

您可以通过用[^'S'r'n]替换's的每个实例来解决此问题,即不匹配"空白(包括换行符)",而匹配"not(非空白或换行符)。

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

然而,接下来你会遇到另一个问题:RegexOptions.Multiline意味着^$'n匹配,所以如果你的比赛中的换行符是'r'n,那么你的比赛将留下一个尾随的'r

为了解决这个问题,您可以使用RegexOptions.Multiline,而是用(?<=^|'r'n)替换^,用(?=$|'r'n)替换$,后者手动匹配'r'n换行符。

这里有一个模式和代码,用于将项目放入字典中进行提取。如果该值为空,则其键在字典中是有效的,但为该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>
*/