2010-04-28 2 views
0

MetaMap 파일은 다음과 같은 한 줄은 :정규식 MetaMap 자바에

mappings([map(-1000,[ev(-1000,'C0018017','Objective','Goals',[objective],[inpr],[[[1,1],[1,1],0]],yes,no)])]). 

형식은 내가 나에게 문자열 'UMLS 개념을 제공 자바에서 정규식 쿼리를 실행하려면

mappings(
     [map(negated overall score for this mapping, 
      [ev(negated candidate score,'UMLS concept ID','UMLS concept','preferred name for concept - may or may not be different', 
       [matched word or words lowercased that this candidate matches in the phrase - comma separated list], 
       [semantic type(s) - comma separated list], 
       [match map list - see below],candidate involved with head of phrase - yes or no, 
       is this an overmatch - yes or no 
       ) 
      ] 
     ) 
     ] 
    ). 

로 설명 ID ', 의미 론적 유형 및 일치 맵 목록. RegEx가 올바른 도구입니까, 아니면 Java에서이 작업을 수행하는 가장 효율적인 방법은 무엇입니까?

답변

3

다음은 정규식 솔루션에 대한 나의 시도입니다. 이 replace "메타 정규식"방법론은 내가 실험하고있는 것입니다. 나는 희망이 더 읽기 쉬운 코드로 읽습니다.

String line = "mappings([map(-1000,[ev(-1000,'C0018017','Objective','Goals',[objective],[inpr],[[[1,1],[1,1],0]],yes,no)])])."; 
String regex = 
    "mappings([map(number,[ev(number,<quoted>,quoted,quoted,[csv],[<csv>],[<matchmap>],yesno,yesno)])])." 
    .replaceAll("([\\.\\(\\)\\[\\]])", "\\\\$1") // escape metacharacters 
    .replace("<", "(").replace(">", ")") // set up capture groups 
    .replace("number", "-?\\d+") 
    .replace("quoted", "'[^']*'") 
    .replace("yesno", "(?:yes|no)") 
    .replace("csv", "[^\\]]*") 
    .replace("matchmap", ".*?") 
; 
System.out.println(regex); 
// prints "mappings\(\[map\(-?\d+,\[ev\(-?\d+,('[^']*'),'[^']*','[^']*',\[[^\]]*\],\[([^\]]*)\],\[(.*?)\],(?:yes|no),(?:yes|no)\)\]\)\]\)\." 

Matcher m = Pattern.compile(regex).matcher(line); 
if (m.find()) { 
    System.out.println(m.group(1)); // prints "'C0018017'" 
    System.out.println(m.group(2)); // prints "inpr" 
    System.out.println(m.group(3)); // prints "[[1,1],[1,1],0]" 
} 

replace 메타 regexing 방금 적절한 replace 설정 (대신 중 하나 개를 읽을 수 엉망으로 모두를 뿌리)에 의해 쉽게 심볼 사이의 공백을 수용 할 수 있습니다.

+0

좋은 사람. Btw : 10 월의 꿈은? – BalusC

+1

메타 정규식 접근 방식이 마음에 듭니다! 지금까지, 나는 오직 String 상수 ('String number = "-? \\ d +"')를 사용하고 이들을 연결했다 ("... +"[ev ("+ number +", "+ ...')). 여전히 추악한 코드가 발생했습니다. –

1

정말 털이 많은 형식입니다. 정규식 길을 가야하는 것 같은 소리,하지만 당신은 정말 털이 정규식 할 겁니다 :

mappings\(\[map\(-?[0-9.]+,\[ev\(-?[0-9.]+,'(.*?)','.*?','.*?',\[.*?\],\[(.*?)\],\[(.*)\],(?:yes|no),(?:yes|no)\)\]\)\]\)\. 

당신이 자바 문자열로 정규식을 표현해야 할 때 그것은 악화 - 언제나 바꿀 것을 모든 \\\입니다. 그러나 이것은 당신이 원하는 것을 얻을 것입니다; 일치하는 그룹 1, 2 및 3은 철수하려는 문자열입니다. 위장이 없기 때문에 조작 된 입력에 대해 엄격하게 테스트하지는 않았습니다. :)

교육 목적을 위해 : 외관상으로도 실제로 구성하기가 어렵지 않았습니다. 샘플 라인을 가져 와서 실제 값을 적절한 와일드 카드로 바꿨으며 괄호에서 벗어나도록했습니다. 대괄호와 점 끝에.

1

가능합니다.

비슷합니다 (따옴표로 묶은 값이 합법적 인 유일한 장소라고 가정하면 []을 (를) 추가 한 값만 합법적 인 '['및 ']'문자입니다 . 경기지도 목록]] 떨어져 말에서 거기에있을 수없는 존재 내부의 값이 될 수 없습니다 당신은 사진을 찍어 - 가정의 많은)

^[^']+?'([^']*+)'[^\[]+\[[^]]+\],\[([^\]]*?)\],\[\[(.*?)\]\].*$ 

제공해야한다... 당신은 3 개의 일치하는 그룹으로 3 개의 필드를 (귀하의 예제에서 http://www.regexplanet.com/simple/index.html으로 테스트)

어느 것이-

"^[^']+?'([^']*+)'[^\\[]+\\[[^]]+\\],\\[([^\\]]*?)\\],\\[\\[(.*?)\\]\\].*$" 

을 Java 문자열로 사용합니다. . .

하지만 이는별로 유지 관리 할 수 ​​없습니다. 아마 이것보다 좀 더 장황한 것이 더 낫겠습니까!