我需要一个RegExp来识别HTML5网页中的第二个结构。
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
发布于 2013-03-01 16:29:40
在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;
}发布于 2013-03-01 16:29:05
/[().]+/g将匹配所有看起来像RNA第二结构的东西(即,点和括号的连续序列)。您应该首先使用此正则表达式查找可能的匹配项。
然后,您可以使用以下命令检查每个匹配项中是否至少包含一个点
if (submatch.indexof(".") != -1)但您无法检查括号是否正确平衡-为此,您需要nhahtdh建议的解析器。
发布于 2013-03-01 16:26:13
这里的问题是,您实际需要匹配的是:
a = . | .(a) | (a). | .a | a.为什么用正则表达式解决这个问题即使不是不可能,也很难,主要的问题是,对于每个左括号,必须有一个闭括号。
使用JavaScript应该可以做到这一点。你需要这样做:
将括号计数器设置为0。遍历整个结构。当找到左括号时,增加计数器。如果找到右括号,请减小计数器。
如果在解析结束时计数器回到零,则结构是ok的。现在唯一缺少的就是所需的点。为此,我将引入另一个变量justOpened或类似的变量。找到左括号时,将其设置为true。当您找到一个点时,将其设置为false。如果你找到一个闭括号,并且你的变量是true,你可以中止,因为你的结构被破坏了。
https://stackoverflow.com/questions/15153301
复制相似问题