2013-08-13 3 views
3

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

Regex regex = new Regex(@"^(?:(?<C0>Lab) (?<C1>\S+) (?<C2>\S+) (?<C3>\S+) (?<C4>\S+) (?<C5>\S+) (?<C6>\S+) (?<C7>.+))$"); 

Вот мой пример текста:

Lab restart int(3) 4332 Range success (Var:4.344-1) 

В конце концов, я хочу поставить мой и так далее к моей вар. Я делаю это так.

Param0 = match.Groups["C0"].ToString(); 
Param1 = match.Groups["C1"].ToString(); 
Param2 = match.Groups["C2"].ToString(); 
Param3 = match.Groups["C3"].ToString(); 
Param4 = match.Groups["C4"].ToString(); 
Param5 = match.Groups["C5"].ToString(); 
Param6 = match.Groups["C6"].ToString(); 
Param7 = match.Groups["C7"].ToString(); 

Param0, Param1 и остальные по-прежнему пуст. Но они не являются нулевыми.

ответ

3

Причина в вашем match.Success = false. Строка ввода не соответствует выражению reg. Попробуйте удалить последнюю группу:

Regex regex = new Regex(@"^(?:(?<C0>Lab) (?<C1>\S+) (?<C2>\S+) (?<C3>\S+) (?<C4>\S+) (?<C5>\S+) (?<C6>\S+))$"); 

Param0 = match.Groups["C0"].ToString(); 
Param1 = match.Groups["C1"].ToString(); 
Param2 = match.Groups["C2"].ToString(); 
Param3 = match.Groups["C3"].ToString(); 
Param4 = match.Groups["C4"].ToString(); 
Param5 = match.Groups["C5"].ToString(); 
Param6 = match.Groups["C6"].ToString(); 

Вы должны использовать match.Success, чтобы проверить, если матч является успешным первым.

+0

Конечно, вы правы. Я не заметил, что добавил слишком много полей в regex. Спасибо за помощь. – user2592968

1

Вместо использования регулярных выражений можно просто разделить на пространстве

var myString = "Lab restart int(3) 4332 Range success (Var:4.344-1)" 
var split = myString.Split(" "); 

Тогда вы будете иметь все параметры в массиве строк, ваше регулярное выражение просто Расщепление пробелов в любом случае.

Проблема с регулярным выражением является то, что последняя группа должна быть там, и в настоящее время у вас нет, что в этом случае регулярное выражение должно выглядеть следующим образом:

"(?<C0>Lab) (?<C1>\S+) (?<C2>\S+) (?<C3>\S+) (?<C4>\S+) (?<C5>\S+) (?<C6>\S+)(?: (?<C7>.+))?" 

Добавив скобки вокруг пространство и группу захвата, а затем добавление ? в конце, последняя группа становится необязательной.

+0

хороший момент, однако он может захотеть добавить еще несколько критериев позже. И этот также должен проверить первую строку, если это «Лаборатория» или нет. –

+0

, вы могли бы просто проверить 'if (split [0] ==" Lab ")', который в моем oppinion легче понять, чем регулярное выражение для большинства людей. – FRoZeN

+0

Существует еще один случай, когда входная строка содержит более двух непрерывных пространств, решение регулярных выражений не будет соответствовать, но это даст правильный результат. Однако это проблема OP. –

1

Как сказал "King King", ваше регулярное выражение неверно. Вот рабочий пример:

Regex regex = new Regex(@"^(?:(?<C0>Lab) (?<C1>\S+) (?<C2>\S+) (?<C3>\S+) (?<C4>\S+) (?<C5>\S+) (?<C6>\S+))$"); 
string s = "Lab restart int(3) 4332 Range success (Var:4.344-1)"; 
Match match = regex.Match(s); 

string Param0 = match.Groups["C0"].ToString(); 
string Param1 = match.Groups["C1"].ToString(); 
string Param2 = match.Groups["C2"].ToString(); 
string Param3 = match.Groups["C3"].ToString(); 
string Param4 = match.Groups["C4"].ToString(); 
string Param5 = match.Groups["C5"].ToString(); 
string Param6 = match.Groups["C6"].ToString(); 

Console.Write(Param0 + "\r\n" 
      + Param1 + "\r\n" 
      + Param2 + "\r\n" 
      + Param3 + "\r\n" 
      + Param4 + "\r\n" 
      + Param5 + "\r\n" 
      + Param6 + "\r\n" 
      ); 

Выход:

Lab 
restart 
int(3) 
4332 
Range 
success 
(Var:4.344-1) 
+0

В вашем примере у вас есть 8 параметров, параметр Param7 (C7) не существует в вашем регулярном выражении. – FRoZeN

+0

@FRoZeN Хороший улов, исправленный сейчас. Ta –

Смежные вопросы