2012-01-15 2 views
0

편집합니다 작업 정규식 (두 번째 그룹을) :하스켈 정규 표현식 구문

(^|[ ,\t\n]+)([0-9\\.]+)($|[ ,\t\n]+) 

원본 게시물 :

을 내가 regex-에서 Text.Regex를 (사용하려고, 하스켈에 새로운 해요 compat)를 사용하여 문자열에서 부동 소수점 값을 추출합니다. 내 정규식을 숫자와 왼쪽 및 오른쪽으로 적어도 하나의 구분 문자로 버퍼링되는 기간의 시리즈를 일치 싶습니다.

regex = "[^ \t\n,]+([0-9\\.])+[$ \t\n,]+" 

편집 : 나는 원래이 스칼라에서 제대로 일을 생각하지만 지금은 단순히 내 테스트 문자열 운이있어 생각이 내가 쓴 것입니다. 하스켈에서는 작동하지 않습니다. 예 :

matchRegexAll (mkRegex regex) "12.34" 

수익률

,691 :이 날 것으로 보인다 때

matchRegexAll (mkRegex regex) " 12.34 " 

Just (" ","12.34 ","",["4"]) 

를 얻을 그것은

Just (""," 12.34 ","",["12.34"]) 

에게 또 다른 예를 산출한다 363,210

Nothing 

그것은 나는 내가 파서 취급 "^"및 스칼라 파서를 수행 다르게 "$"를 추측하고있어

Just ("","12.34","",["12.34"]) 

양보해야한다고 생각하면,하지만 내가 가진 전부입니다.

+2

스칼라가 그 정규식으로 기대하는 것을 수행한다면 그 정규식 엔진이 손상되어야합니다. – kennytm

답변

3

과 같은 문자 클래스 안에서 일반 정규식 메타 문자 (예 : ^$)는 특별한 의미를 잃습니다. 그들은 대신 자신을 찾습니다. (^|[ \t\n,])과 같은 것은 원하는 것을해야합니다.

저는 스칼라에서 정규 표현식이 작동하는 것에 놀랐습니다. 이 방식으로 동작하지 않는 정규식 구현을 본 적이 없습니다. FlopCoder가 지적으로

1

는 있지만, 문자 클래스의 시작 ^ 실제로 에게 그것을 부정.

+0

'[^ \ t \ n,]'은 스페이스, 탭, 개행 또는 쉼표가 아닌 모든 것을 의미한다고 생각합니다. 그건 루비에서 작동하고 내 Regexp 구문으로 가장 잘 알려져 있습니다. – Hauleth

3

[] 내부의 기호 ^하지을 의미한다. 이 을 사용하면 다른 문자는 과 ] 사이에 포함되지 않습니다. 시작에서 정규 표현식을 일치 시키려면 정규 표현식의 맨 앞에 ^을 입력하십시오.

$은 문자열의 끝으로 사용하려는 경우에도 마찬가지입니다.

1

"[^ \t\n,]+([0-9\\.])+[$ \t\n,]+"는 시퀀스의 끝에서 두 번째 캡처, 탐욕 ' ', '\t', '\n', ','] 것도, 숫자 또는 도트의 비어 있지 않은 시퀀스 및 "$ \t\n," 중 어느 한 비어 있지 않은 서열이없는 자 비어 있지 서열 일치한다.첫 번째는 " 12.3"이고 두 번째/두 번째 마지막 두 번째는 "4"과 일치해야합니다.