2013-03-01 2 views
1

HTML5 웹 페이지에서 RNA Second 구조를 식별하려면 RegExp가 필요합니다.HTML5의 RNA 두 번째 구조 regexp 패턴

RNA Second Structure는 단순히 도트 점과 균형 조정 괄호가 포함 된 문자열로, RNA 모양을 식별하는 데 사용되며, 목표 RNA 모양을 알면 그와 함께 RNA를 만들 수있는 염기 서열을 추측 할 수 있습니다 대상 모양.
최소한 하나의 점 .을 포함해야합니다. 예를 들어

.....((((...).))..).... 
(((....))) 
....(((..)))...()...(....((..))) 

사실 RNA 두 번째 구조이지만

.....((((....)))... 
....a.((((......))))...... 
((((())))) 

사실 구조

이들은 식별 구조 내 모든 시도가 실패 있습니다

되지 않습니다

<input type="text" pattern="/[.()]/g" /> 
<input type="text" pattern="/[.()]/g" /> 
<input type="text" pattern="/[\.\(\)]/g" /> 
<input type="text" pattern="/[().]/g" /> 
<input type="text" pattern="/[()\.]/g" /> 
<input type="text" pattern="/[\.()]/g" /> 

저는 RegExp을 처음 접했고 교사가 저에게 그렇게하도록 명령했기 때문에 웹에서 프로그램을 게시해야합니다!
그리고 그냥 사용해야하는 RegExp을 알려주십시오! 내 프로그램 (libRNA) 자체가 괄호의 균형을 검사합니다!
libRNA

+1

밸런싱 부분이 얼마나 중요한가를? ECMAScript regexes를 사용하는 것은 불가능하기 때문입니다. –

+0

또한 두 번째 예제에서'a' * 앞에있는 부분은 유효한 시퀀스가 ​​될 것입니다, 맞습니까? –

+0

@TimPietzcker : 예. 'a'의 앞과 뒤의 문자열은 유효한 시퀀스입니다. 와 나는 지식을 위해 그것을 말했다. 내 프로그램 (libRNA) 자체가 균형 괄호를 확인합니다. [libRNA] (http://mostafa.ut.ac.ir/libRNA/) – ARF

답변

0

문제는 여기에 당신이 실제로 일치 할 필요하기 때문이다 : 불가능은 모든 개방 paranthesis 거기에 가지고있는 경우

a = . | .(a) | (a). | .a | a. 

왜 정규식이 문제를 해결하는 가장 큰 문제는 힘들 것입니다 닫는 것.

JavaScript로 가능해야합니다. 다음과 같이해야합니다 :

paranthesis 카운터를 0으로 설정하십시오. 전체 구조를 반복합니다. 개구 paranthesis가 발견되면 카운터를 증가시킵니다. 닫는 괄호를 찾으면 카운터를 줄입니다.

구문 분석이 끝나면 카운터가 0으로 돌아 가면 구조가 정상입니다. 지금 누락 된 것은 필요한 점입니다. 이를 위해 다른 변수 인 justOpened 또는 비슷한 것을 소개합니다. 당신이 개구 paranthesis를 찾을 때 당신은 true로 설정합니다. 도트를 발견하면 false으로 설정합니다. 닫는 괄호를 찾고 변수가 true 인 경우 구조가 손상 되었기 때문에 중단 할 수 있습니다.

+0

나는 숙제라고 가정 했으므로 어떤 코드도 제공하지 않고 단지 지침 만 제공했다. –

+0

가사는 아니지만 사용자로부터 서열을 제공하고 RNA 구조를 반환하는 형식입니다! 여기에 양식을 볼 수있는 웹 페이지가 있습니다. 어떤 구조를 입력하고 당신이 뭘보고 볼 수 있습니다! [libRNA] (http://mostafa.ut.ac.ir/libRNA) 방금 ​​libRNA 프로그램 자체를 작성했으며 웹 프로그래밍에 대한 지식이 충분하지 않았습니다! – ARF

1
/[().]+/g 

은 RNA 제 2 구조 (즉, 도트 및 괄호의 연속적인 서열)와 같은 모든 것을 매치시킬 것이다. 먼저이 정규식을 사용하여 가능한 일치 항목을 찾아야합니다.

그런 다음

if (submatch.indexof(".") != -1) 

를 사용하여 적어도 하나의 점은 그 경기의 각각에 포함되어 있는지 여부를 확인할 수 있습니다하지만 당신은 괄호가 제대로 균형 여부를 확인할 수 없습니다 - 그것에 대해 당신이 nhahtdh 같은 파서가 필요합니다 제안했다.

+0

때마다 아닙니다! 여는 괄호와 닫는 괄호 만 입력하면 올바르지 않지만 시퀀스에()와 비슷한 것이 있으면 ((.. ((..)))))). .() ... – ARF

2

불가능 자바 스크립트 RegExp의 수준의 지원 일반화 브래킷 균형 (브래킷의 유한 한 많은 중첩 수준을)하는 것입니다. (Perl, PCRE, .NET 정규 표현식에서는 일반화 된 대괄호 균형을 조정할 수 있습니다.)

당신은 그래도 확인하는 간단한 자바 스크립트 함수를 작성할 수 있습니다

function isValidSequence(str) { 
    if (!/\./.test(str)) { 
     // Dot . not found 
     return false; 
    } 

    var openBrackets = 0; 

    for (var i = 0; i < str.length; i++) { 
     if (str[i] === "(") { 
      openBrackets++; 
     } else if (str[i] === ")") { 
      if (openBrackets > 0) { 
       openBrackets--; 
      } else { 
       // Reject the case ..)(.. 
       return false; 
      } 
     } else if (str[i] !== ".") { 
      // Garbage character, since it is not . or (or) 
      return false; 
     } 
    } 

    // Check all brackets are properly closed 
    return openBrackets === 0; 
}