1

我需要一个 RegExp 来识别 HTML5 网页中的 RNA Second 结构。

RNA 第二结构只是一个仅包含点和平衡括号的字符串,它用于识别 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 的新手,我应该在网络上发布我的程序,因为我的老师命令我这样做!
请告诉我应该使用的正则表达式!我的程序( libRNA )本身检查括号的平衡!
库RNA

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 第二结构的所有内容(即连续的点和括号序列)。您应该首先使用此正则表达式来查找可能的匹配项。

然后,您可以使用以下方法检查每个匹配项中是否至少包含一个点

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 回答