2014-02-13 3 views
0

문자열에서 MIDI 노트 이름과 옥타브를 추출하여 결과를 실제 MIDI 노트 값으로 바꾸기 위해 정규식을 디자인하려고합니다.regex가 MIDI 노트 이름을 구문 분석하도록 제안 하시겠습니까?

다음
0 = C-2 
1 = C#-2 
2 = D-2 
... 
125 = F8 
126 = F#8 
127 = G8 

내가 지금 가지고있는 내용은 다음과 같습니다 :

MIDI 노트 이름 있도록 0 ~ 127에 해당하는 G8에 C-2에서 분리 된 범위입니다

^([CDEFGAB]#?)(-?[0-8])

이 표현식은 캡처 그룹이있는 유효한 모든 MIDI 노트와 일치하며, 확실한 숫자는 K9입니다. 문제는 이것도 A10과 같은 가짜 입력과 일치한다는 것인데, 나에게 주 = A 옥타브 = 1을주는 것은 잘못된 것입니다.

EDIT : 물론 이것은 -8과 같은 잘못된 옥타브도 허용하지만 일치 후에 필터링 할 수 있습니다.

이것은 Objective-C 프로젝트의 일부로 ICU regex flavor를 사용합니다.

제안 사항?

답변

1

^([CDEFGAB]#?)((?:-[1-2])|[0-8])$

이 몇 가지 문제가 해결됩니다. 첫째, 정규 표현식의 끝 부분에 $를 추가하기 때문에 문자열의 끝에서 $가 멈 춥니 다 (이것은 A10을 방지합니다. 정확히 하나의 숫자와 일치합니다). 그리고, 세그먼트

((?:-[1-2])|[0-8])

(그리고 (?:...)에서 두번 캡처하지 1)과 (2) 사이의 음의 값을 취한다하거나, 또는 포지티브 0-8의 원래 범위를 취할 것이다.

+0

하나는 수정했지만 다른 하나는 수정하지 않았습니다. 지금 고치고있어. 좋은 캐치! – gregkow

관련 문제