1

HTML5 Web ページで RNA Second 構造を識別するために RegExp が必要です。

RNA の 2 番目の構造は、単純にドット ポイントと平衡括弧のみを含む文字列であり、RNA の形状を識別するために使用されます。ターゲットの RNA の形状がわかっている場合は、そのターゲットの形状を持つ RNA を作成できる塩基のシーケンスを推測できます。
少なくとも 1 つのドットが含まれている必要があることに注意してください.

例えば

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

真の RNA Second Structure ですが、

.....((((....)))...
....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 を初めて使いました。先生がそうするように命じたので、自分のプログラムを Web で公開する必要があります。
そして、私が使用すべき正規表現を教えてください! 私のプログラム ( libRNA ) 自体が括弧のバランスをチェックします!
libRNA

4

3 に答える 3

2

JavaScript のサポート レベルでは、一般化されたブラケット バランス (有限数のネスト レベルのブラケット) を実行することは不可能です。(Perl、PCRE、.NET 正規表現では、一般化されたブラケット バランシングを実行できます)。RegExp

ただし、簡単な JavaScript 関数を記述してチェックすることはできます。

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;
}
于 2013-03-01T08:29:39.967 に答える
1
/[().]+/g

RNA Second Structure のように見えるすべてのもの (つまり、ドットと括弧の連続シーケンス) に一致します。最初にこの正規表現を使用して、可能な一致を見つける必要があります。

次に、これらの一致のそれぞれに少なくとも 1 つのドットが含まれているかどうかを確認できます。

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

ただし、括弧が正しくバランスが取れているかどうかを確認することはできません。そのためには、nhahtdh のようなパーサーが必要です。

于 2013-03-01T08:29:05.030 に答える
0

ここでの問題は、実際に一致させる必要があるのは次のとおりです。

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

これを正規表現で解決することが不可能ではないにしても難しい主な問題は、開き括弧ごとに閉じ括弧が必要なことです。

JavaScript でこれを行うことができるはずです。次のようなことをする必要があります:

括弧カウンターを に設定し0ます。構造全体を反復します。開始括弧が見つかった場合、カウンターを増やします。閉じ括弧が見つかった場合は、カウンターを減らします。

解析の最後にカウンターがゼロに戻った場合、構造は問題ありません。現在欠けているのは、必要なドットだけです。そのために、別の変数justOpenedまたは類似のものを導入します。開き括弧が見つかったら、それを に設定しtrueます。ドットが見つかったら、それを に設定しfalseます。閉じ括弧が見つかり、変数が であるtrue場合、構造が壊れているため中止できます。

于 2013-03-01T08:26:13.197 に答える