2016-10-12 3 views
1

Я искал ответ на свой вопрос, но не смог найти, поэтому я пишу здесь.Regex Совпадение нескольких вхождений с номерами в строке C#

Я хочу взять пример строки: = «+37513220102304920105590»

и найти все матчи для чисел длиной 11, который начинается 3 или 4.

Я пытался сделать так:

string input = "37513220102304920105590" 
var regex = new Regex("^[3-4][0-9]{10}$"); 
var matches = regex.Matches(trxPurpose); 

// I expect it to have 3 occurances "37513220102", "32201023049" and "30492010559" 
// But my matches are empty. 
foreach (Match match in matches) 
{ 
    var number = match.Value; 

    // do stuff 
} 

Мой вопрос: Является ли мое регулярное выражение плохим, или я что-то не так с математикой?

ответ

3

Используйте захват внутри позитивного обзора, и вам также необходимо удалить анкеры. Обратите внимание, что - между 3 и 4 является избыточным.

(?=([34][0-9]{10})) 

См. regex demo.

В C#, так как значения захватили, вам нужно собрать .Groups[1].Value содержимое см C# code:

var s = "37513220102304920105590"; 
var result = Regex.Matches(s, @"(?=([34][0-9]{10}))") 
     .Cast<Match>() 
     .Select(m => m.Groups[1].Value) 
     .ToList(); 
+0

Вы можете написать '[34] и' \ d', если вы хотите, чтобы ваш regex short;) Я не знал о '? =', хорошем. –

+2

Да, '[3-4]' = '[34]'. Это больше примечание к OP. Что касается '\ d', я бы сделал это только с добавлением флага' RegexOptions.ECMAScript', так как '\ d' соответствует более ASCII-цифрам. См. [* '\ D' менее эффективен, чем' [0-9] '*] (http://stackoverflow.com/a/16621778/3832970). –

+0

И '\ d {10}' вместо '[0-9] {10}', то я не думаю, что вы можете сделать его короче –

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