2012-01-24 5 views
1

나는 정규식에 매우 익숙하며 내 머리를 완전히 감쌀 수 없다.문자열에서 쉼표로 구분 된 숫자를 추출하는 방법

두 개의 정규식을 작성하려고합니다. 가능한지 말해 줄 필요가 있습니다. 둘 다 VB.net 구문을 기반으로합니다.

정규식 1 : 나에 대해 테스트하고있어 문자열 - 디스크에 크기 : 25754900936 바이트

그것은 선행 공백의 소수를 가지고 있지만, 텍스트가 항상 동일합니다. 나는 숫자 (25,754,900,936)만을 추출하려고 노력하고있다.

몇 가지 정규식을 시도했지만 한 줄로 모든 것을 가져올 수 없습니다. 쉼표는 나를 망쳐 놓고 여러 경기를 반환합니다 (예를 들어, \ d + \ W +는 4 개의 일치 항목을 쉼표로 구분하여 표시합니다.)

가장 잘한 것은 [0-9/,] *하지만 그것은 나에게 빈 공 일치 25 개와 일치 번호 1 개 (일치시 19)를줍니다. 경기 1에서 일치해야합니다.

Doable? 문자열에서 숫자를 추출 할 수있는 정규식을 보면 정말 도움이 될 것입니다.

정규식 2 :
같은 생각이지만 지금은 여러 줄입니다.

나에 대해 테스트하고있어 문자열 -

  0 File(s)    0 bytes 
      1 File(s)   11,546 bytes 
      1 File(s)  259,584 bytes 
      3 File(s)   5,682 bytes 
     17218 File(s) 25,705,262,230 bytes 

은 그 마지막 줄 (25705262230)에 그냥 총 바이트가 필요합니다. 다중 행 검색에서이 작업을 수행 할 수 있습니까? 동일한 거래 - 텍스트는 항상 동일합니다. 첫 번째 정규식 그냥 숫자를 추출하려면

답변

2

,이 시도 :

(\d+,?)+ 

그것은 하나 개 이상의 숫자 (0-9)의 그룹과 일치하는 것, 선택적으로 하나를 발생 쉼표 (,?) 다음 또는 더 많은 시간. 당신이 문자열은 항상 '바이트'로 끝나는 것을 알고 경우 여러 문자열을

,이 시도 :

(\d+,?)+(?=\s*bytes$) 

이 다시 첫번째 정규 표현식과 유사 일치, 라인이 '에서 끝나야하지만 바이트 '는 $과 같이 줄의 끝을 의미합니다. 숫자를 추출

'Regex is your regular expression object containing the second regex 
regex.Match([your string]).Value 
+0

제임스 - 둘 다 실제로 작동했는데 실제로 이것을 .net에서 사용하지 않고 있습니다. 정규식을 수행 할 수있는 타사 앱을 사용하고 있습니다. 불행히도 첫 번째 캡처 인 첫 번째 그룹에서만 작동합니다. 그 자리에 그것을 두 번째 정규식에 어떤 식 으로든? 지금은 첫 번째 그룹의 첫 번째 캡처에서 여전히 바이트라는 단어가 있지만 그렇지 않으면 완벽합니다. – Pat

+0

@Pat 아 걱정이 없습니다. 문자열의 끝 (캡처하지 않으려는 'bytes')이 포함되지 않도록 긍정적 인 미리보기를 추가해야합니다. 위의 두 번째 정규식을 수정했습니다. 그게 작동하는지 알려주세요 - 단순히'regex.Match ([your string])을 사용하여 일치 된 값 ('bytes'제외)을 추출했습니다 .Value' –

+0

Perfect - thanks! – Pat

0

같은 정규식을 사용합니다 :

/Size on disk: ((?:\d+,?)+)/ 

다음 첫 번째 캡처 그룹을 추출 그런 다음 캡처 한 값을 추출해야합니다.자바 스크립트 : ... 음, OK, 하나 또는 그 이상의 을 찾을 수 - 정규 표현식 (안에서부터 밖으로)라고

var s = "Size on disk: 25,754,900,936 bytes"; 
var bytes = s.match(/Size on disk: ((?:\d+,?)+)/)[1]; 
// "25,754,900,936" 

그건

  • \d - 숫자 문자
    • + 찾기
  • , - 그 다음 문자 쉼표
    • ? - 음, 아마도; 당신이 중 하나를 찾을 수없는 경우 괜찮아요 그
  • (?:…) - 일어날 수 있도록 해당 그룹을 - 지금,이 모든 것을 가지고 우리가
    • +을 저장할 필요가없는 그룹으로 취급 시간
    • 의 수
  • (…)-
  • 오, 그래, 당신은 텍스트를 찾을 수있는이 모든 전에 그 권리를 보장하는 모든 결과를 캡처하고 나를 위해 그것을 저장 "Size on disk: "

멀티 라인에서 정규 표현식을 입력 끝에 고정하십시오. 다시 말하지만, 여기에 자바 스크립트의 예는 다음과 같습니다

var re = /((?:\d+,?)+) bytes$/m; 
var total = multiline.match(re)[1]; 

현재 작업에서 볼 수 있습니다 http://jsfiddle.net/uFfsc/1/

그것은 입력의 끝에 .NET에서 정규 표현식을 고정하는 방법은 당신에게 달려 있습니다.

+0

Phrogz - 설명해 주셔서 감사합니다. 위의 제임스 정규식 잘 작동하고, 불행히도 (내 잘못을 언급하지 않음), 난 그냥 정규식을 허용 타사 애플 리케이션을 사용하고 있습니다. 자바 스크립트 등을 추가 할 수있는 프로그래밍 언어는 아니지만 여러분의 설명은 훌륭했으며 정규 표현식이하는 일을 조금 더 잘 이해할 수있었습니다. – Pat

+0

비 캡처 괄호를 추가하여 역 참조를 생성하지 않았습니다. :) –

+0

@Pat 도움을 주셔서 감사합니다. – Phrogz

관련 문제