2015-03-17 3 views
0

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

EC22941C/02/ORI 

должен дать мне: EC22941C

я использовал http://www.regexr.com/ построить мое выражение:

(EC.+?)\/.+ 

При испытании против моего текста:

EC22941C/02/ORI 

Он правильно говорит мне, что первая группа

EC22941C 

Когда я положил его в C#:

public static string GetInstructionRef(string supplierReferenceId) 
    { 
     // The instruciton ref is the bit before the slash    
     var match = Regex.Match(supplierReferenceId, @"(EC.+?)\/.+"); 

     if (match == null || match.Groups.Count == 0) 
      return ""; 

     // Return the first group which is the instruction ref 
     return match.Groups[0].Value; 
    } 

В результате я получаю Спинка:

EC22941C/02/ORI 

Я попробовал количество разных шаблонов, и все они, похоже, делают то же самое.

Кто-нибудь знает, что я делаю неправильно?

ответ

1

Вопроса заключается в том, что вы возвращение индекса неправильной группы, 0 вернет весь матч, а 1 возвращает согласованный контекст захваченного — нумеруется слева направо.

return match.Groups[1].Value; 
+1

О человек, я чувствую себя так глупо! Это смотрело мне в лицо, спасибо! – mikeysee

0

Вы должны использовать match.Groups[1].Value.

match.Groups[0].Value возвращает всю строку (если она соответствует шаблону).

Кроме того, вы также хотите изменить свое условие. :)

1
^EC[^\/]+ 

Вы можете просто использовать это и избегать использования групп. См. Демонстрацию.

https://regex101.com/r/bW3aR1/6

string strRegex = @"^EC[^\/]+"; 
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline); 
string strTargetString = @"EC22941C/02/ORI"; 

foreach (Match myMatch in myRegex.Matches(strTargetString)) 
{ 
    if (myMatch.Success) 
    { 
    // Add your code here 
    } 
} 
Смежные вопросы