我有我的正则表达式代码,可以在我的电子邮件正文中解析它。
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
}
问题是,即使格式(电子邮件正文)是正确的,它仍然不匹配我的正则表达式,它不存储在我的数据库中。
我的正则表达式是否正确?
答案 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注入。