2016-10-12 2 views
1

내 문제는 대답을 찾고 있었지만 찾을 수 없어서 여기에 적었습니다.Regex C에서 여러 번 일치하는 숫자 C#

내가 문자열 예를 먹고 싶어 : 시작 길이 11의 숫자에 대한 모든 일치 = "37,513,220102304920105590"

을 찾아 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

긍정적 인 예측 앞에서 캡처를 사용하고 앵커도 제거해야합니다. 34 사이의 -은 중복됩니다.

(?=([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

'[0-9] {10}'대신'\ d {10}'을 쓰면, 더 짧게 만들 수 있다고 생각하지 않습니다. –

관련 문제