我需要一个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的新手,我应该在网上发布我的程序,因为老师命令我这样做!
请告诉我我应该使用的RegExp!我的程序(libRNA)本身检查括号的平衡!
libRNA
答案 0 :(得分:2)
不可能使用JavaScript RegExp
的支持级别进行广义括号平衡(有限多个嵌套级别的括号)。 (在Perl,PCRE,.NET正则表达式中,可以进行广义括号平衡)。
您可以编写一个简单的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;
}
答案 1 :(得分:1)
/[().]+/g
将匹配看起来像RNA第二结构的所有内容(即连续的点和圆括号序列)。您应该首先使用此正则表达式来查找可能的匹配项。
然后,您可以使用
检查每个匹配项中是否包含至少一个点if (submatch.indexof(".") != -1)
但你无法检查括号是否正确平衡 - 因为你需要一个像nhahtdh建议的解析器。
答案 2 :(得分:0)
这里的问题是你真正需要匹配的是:
a = . | .(a) | (a). | .a | a.
使用正则表达式解决这个问题的主要问题很难,如果不是不可能的话,每个开头的副词都必须有一个结束语。
应该可以使用JavaScript执行此操作。你需要做这样的事情:
将paranthesis counter设置为0
。迭代整个结构。当找到开头的paranthesis时,增加计数器。如果找到右括号,请减小计数器。
如果在解析结束时计数器回零,则结构正常。现在唯一缺少的是必需的点。为此,我将介绍另一个变量justOpened
或类似的东西。当您找到一个开头义务时,您将其设置为true
。当您找到一个点时,将其设置为false
。如果找到右括号并且变量为true
,则可以中止,因为您的结构已损坏。