2012-09-11 2 views
3

좋아요, 그 제목은주의 그래버였습니다. 나는 그것을 인정할 것이다. 지금 질문하기!AS3 팬더 티컵 (재귀 구문 분석, 태그 지정 및 정규식)

개요 프로젝트에 일부 코드가 있습니다. 해당 태그 텍스트를 HTML 태그 (Flash 위키 용)로 작업하고 있습니다. 나는 자기가 포함하고있는 별도의 파일을 만들었는데, 나는이 질문에 더 명확하게하기 위해 집중할 것이다.

내가 원하는 것 입력 내용은 키워드 목록과 텍스트 블록입니다. 이 경우 입력이 예상되는 출력이 있어야한다

["panda","tea","tea cup","panda tea cup"]; 

"Tea is good. I like tea cups, too. Pandas also like tea but need special panda tea cups to drink it."; 

입니다 :

"<Tea> is good. I like <tea cups>, too. <Panda>s also like <tea> but need special <panda tea cups> to drink it. 

나는 내가이 작업을 수행 할 수있을 거라고 생각 문제 간단한 replace() 함수를 사용했지만 결국에는 다음과 같이 끝낼 것이라고 깨달았습니다.

"<Tea> is good. I like <<tea> cups>, too. <Panda>s also like <tea> but need special <<panda> <<tea> cups>> to drink it." 

나는 싫어.

필자는 결국 가장 긴 키워드로 시작하여 코드를 가장 작은 키워드로 나누는 재귀 함수를 작성하기로 결정했습니다. 지금은 완전히 혼란스럽고 재귀적인 오류가 계속 발생합니다.

전체 코드 귀하의 훌륭한 답변을

//Setup 
var kw:Array = ["panda","tea","tea cup","panda tea cup"]; 
var s:String = "Tea is good. I like tea cups, too. Pandas also like tea but need special panda tea cups to drink it."; 
var openTag:String = "<<"; 
var closeTag:String = ">>"; 
var tS:Array = []; 
//Sort by length (longest to shortest) 
for (var i:int = 0; i<kw.length; i++) { 
    for (var j:int = kw.length - 1; j > i; j--) { 
     if (kw[j - 1].length < kw[j].length) { 
      var temp:String = kw[j - 1]; 
      kw[j - 1] = kw[j]; 
      kw[j] = temp; 
     } 
    } 
} 
//Parse 
tS[0] = s; 
s = recursiveParse(s); 
var n:int = 0; 
function recursiveParse(m:String) { 
    var tP = kw[n]; 
    if (m.length == 0) { 
     return "test"; 
    } 
    var p:RegExp = new RegExp(tP,"gi"); 
    m = m.replace(p,openTag + "$&" + closeTag); 
    tP = "[<>]"; 
    p = new RegExp(tP); 
    var b:Array = m.split(p); 
    var fI:String = ""; 
    n++; 
    for each (var f in b) { 
     if (f.length > 0) { 
      tS[tS.length] = recursiveParse(f); 
     } 
    } 
    return fI; 
} 
trace(s); 

사전에 감사합니다! 위의 코드는 어느 정도 신경 쓰이지 않습니다. 당신의 대답이 코드에 대한 간단한 3 줄 수정이나 자신의 33 라인 코드에서 내 작업을 무시한다면, 나는 그걸로 충분하다. 입력이 출력으로 변환되는 한.

업데이트 : 좋아요, 이제 stackoverflow가 꺾쇠 괄호를 숨기고 있음을 알았습니다. 그걸 고쳐야 해. 업데이트 : 꺾쇠 괄호가 고정되었습니다.

+0

"차"와 "차 컵"에는 "차"가 포함되어 있습니다. 우선 순위가 있습니까? 아니면 여러 번 태그를 추가 할 수 있습니까? – philipp

+0

우선 순위가 없습니다. 내 의도는 그들을 완전히 별도로 처리하는 것입니다. 더 나은 설명을 위해 질문 설명에서 예상 결과를 확인하십시오. –

답변

6

자, 재귀를 사용할 필요가 없습니다. 첫째, 복잡성 감소하는 순서로 확인 배열하여 검색 문자열을 만들 : 문자열 A가 문자열 B가 포함되어있는 경우

입니다
var kw:Array = ["panda tea cup","tea cup","panda","tea"]; 

, 다음, A가 먼저 와야. 그런 다음,이 정규식을 사용할 수 있습니다

var p:RegExp = new RegExp("("+kw.join("|")+")","gi"); 

을 그리고 당신이 지금처럼, <$&>하여 일치를 대체 : /(panda tea cups|tea cups|tea|panda)/i하거나, 귀하의 경우, 않습니다.

이 정규식은 here에서 볼 수 있습니다.

+0

이것은 훌륭합니다. 비 정규 표현식에서 너무 많은 시간을 낭비했습니다. 조금도. 조금도. 조금도. 고맙습니다. –

관련 문제