2015-05-18 1 views
1

У меня есть строка, в соответствии со следующей схемой:Regexp найти положение различных символов в строке

(cc)-(nr).(nr)M(nr)(cc)whitespace(nr) 

где cc является artbitrary количества буквенных символов, nr является произвольным количеством числовых символов, и M это является фактическое письмо M.

Например:

ASF-1.15M437979CA 100000 
EU-12.15M121515PO 1145 

мне нужно найти позиции -, . и M Whithin строки. Проблема в том, что ведущие символы и конечные символы могут содержать также букву M, но мне нужен только тот, что посередине.

В качестве альтернативы вычитание первых символов (до -) и первых двух чисел (как в (nr).(nr)M...) было бы достаточно.

+0

Поскольку (cc) и (nr) не могут содержать символы '-' или '.' почему вы не используете [IndexOf] (https://msdn.microsoft.com/en-us/library/k8b1470s%28v=vs.110%29.aspx)? Найдя «.» Вы можете найти «М» в позиции после «.». –

+0

Можете ли вы изменить свой вопрос и добавить решение, которое у вас есть до сих пор? Благодаря! –

+0

У меня есть решение, обеспечивающее Mehrzad Chehraz. Но я хочу иметь хороший вариант :-) – Freud

ответ

0

Если вам необходимо регулярное выражение на основе решения, нужно просто использовать 3 захватив группы вокруг требуемых шаблонов, а затем получить доступ к Groups[n].Index свойство:

var rxt = new Regex(@"\p{L}*(-)\d+(\.)\d+(M)\d+\p{L}*\s*\d+"); 
// Collect matches 
var matches = rxt.Matches(@"ASF-1.15M437979CA 100000 or EU-12.15M121515PO 1145"); 
// Now, we can get the indices 
var posOfHyphen = matches.Cast<Match>().Select(p => p.Groups[1].Index); 
var posOfDot = matches.Cast<Match>().Select(p => p.Groups[2].Index); 
var posOfM = matches.Cast<Match>().Select(p => p.Groups[3].Index); 

Выход:

posOfHyphen => [3, 32] 
posOfDot => [5, 35] 
posOfM  => [8, 38] 
0

Regex :

string pattern = @"[A-Z]+(-)\d+(\.)\d+(M)\d+[A-Z]+"; 
string value = "ASF-1.15M437979CA 100000 or EU-12.15M121515PO 1145"; 

var match = Regex.Match(value, pattern); 

if (match.Success) 
{ 
    int sep1 = match.Groups[1].Index; 
    int sep2 = match.Groups[2].Index; 
    int sep3 = match.Groups[3].Index; 
} 
+0

Также замечательная и действительная душа. благодаря – Freud

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

  • Нет связанных вопросов^_^