2016-04-05 6 views
0

У меня есть мои коды регулярных выражений, чтобы разобрать это на моем теле электронной почты.Regex не правильно разбирается в теле письма

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 
} 

Проблема даже если формат (электронная почта тело) является правильным, он по-прежнему не соответствует моему регулярному выражению, и это не хранящиеся в моей базе данных.

Правильно ли мое регулярное выражение?

+5

Последняя часть re19 - конечно, вы хотите. * Not \\ s + – BugFinder

+0

Кроме того, используйте 'RegexOptions.Singleline' вместо Multiline – bkdev

+0

Вы также можете использовать' '(\\ s)" 'вместо' (\\ n) "' для 'Белого пространства 2,4,6';). –

ответ

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 инъекции.

+0

Я скопировал ваш шаблон регулярных выражений, но у меня возникла эта ошибка: синтаксический разбор «Building: \ s (\ d) \ s * Уровень: \ s (\ d) \ s * (Phase: \ s (\ d +) \ s * Запрос: \ s (. *) "- Недостаточно). – Pam

+0

Да, была опечатка, исправлено –

+0

Спасибо! Он уже хранится в моей базе данных. Я ценю вашу помощь! – Pam