正则表达式没有正确解析电子邮件正文

时间:2016-04-05 07:13:49

标签: c# regex email

我有我的正则表达式代码,可以在我的电子邮件正文中解析它。

Building: {building number} // new line
Level: {level of building} // new line
Phase: {phase or room number} // new line
Request: {your request}

示例:

Building: 1
Level: 2
Phase: 20
Request: Get 4 chairs 

这是我的正则表达式:

string re1 = "(Building)"; // Word 1
string re2 = "(:)";        // Any Single Character 1
string re3 = "(\\s+)";     // White Space 1
string re4 = "(\\d)";      // Any Single Digit 1
string re5 = "(\\n)";      // White Space 2
string re6 = "(Level)";    // Word 2
string re7 = "(:)";        // Any Single Character 2
string re8 = "(\\s+)";     // White Space 3
string re9 = "(\\d)";      // Any Single Digit 2
string re10 = "(\\n)";     // White Space 4
string re11 = "(Phase)";   // Word 3
string re12 = "(:)";       // Any Single Character 3
string re13 = "(\\s+)";    // White Space 5
string re14 = "(\\d+)";    // Integer Number 1
string re15 = "(\\n)";     // White Space 6
string re16 = "(Request)"; // Word 4
string re17 = "(:)";       // Any Single Character 4
string re18 = "(\\s+)";    // White Space 7
string re19 = "(\\s+)";    // Match Any

Regex r = new Regex(re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9 + re10 + re11 + re12 + re13 + re14 + re15 + re16 + re17 + re18 + re19, RegexOptions.Multiline);

Match m = r.Match(body);

if (m.Success) {
    blah blah blah
} else {
    blah blah
}

问题是,即使格式(电子邮件正文)是正确的,它仍然不匹配我的正则表达式,它不存储在我的数据库中。

我的正则表达式是否正确?

1 个答案:

答案 0 :(得分:1)

首先,有一些无用的并发症阻止匹配。这个答案总结了评论中提出的建议,试图改进你的正则表达式。

然后,由于括号,你的正则表达式正在组成所有内容。虽然这不是特别成问题,但这完全没用。如果你愿意,你可以匹配邮件中传递的值,但这是完全可选的。这将是结果正则表达式:

Building:\s(\d)\s*Level:\s(\d)\s*Phase:\s(\d+)\s*Request:\s(.*)

您可以在此处Regex101尝试,并查看正则表达式的分组结果。

如果要检索值,可以使用Matcher。 带有转义字符的结果java代码如下:

String regex = "Building:\\s(\\d)\\s*Level:\\s(\\d)\\s*Phase:\\s(\\d+)\\s*Request:\\s(.*)";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(body);
if (matcher.matches()) {
    // There could be exceptions here at runtime if values in the mail
    // are not numbers, handle it any way you want
    Integer building = Integer.valueOf(matcher.group(1));
    Integer level = Integer.valueOf(matcher.group(2));
    Integer phase = Integer.valueOf(matcher.group(3));
    String request = matcher.group(4);
}

我强烈建议在最后一次输入时要非常小心,以避免任何类型的SQL注入。