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>
。我想要没有结果或空洞。
答案 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>
*/