首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML5的第二种结构正则表达式模式

HTML5的第二种结构正则表达式模式
EN

Stack Overflow用户
提问于 2013-03-01 16:15:25
回答 3查看 165关注 0票数 1

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

RNA的第二个结构就是一个只包含点和平衡括号的字符串,它被用来识别RNA的形状,如果我们知道目标RNA的形状,我们就可以猜测出可以制造出具有该目标形状的RNA的碱基序列。

请注意,它应该至少包含一个点.

例如

代码语言:javascript
复制
.....((((...).))..)....
(((....)))
....(((..)))...()...(....((..)))

是真正的RNA第二结构,但是

代码语言:javascript
复制
.....((((....)))...
....a.((((......))))......
((((()))))

不是真正的结构

这些是我识别结构的所有失败的尝试:

代码语言:javascript
复制
<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

EN

回答 3

Stack Overflow用户

发布于 2013-03-01 16:29:40

在JavaScript RegExp的支持级别上,不可能进行广义的括号平衡(有限多个括号的嵌套级别)。(在Perl、PCRE、.NET正则表达式中,可以进行广义括号平衡)。

不过,您可以编写一个简单的JavaScript函数进行检查:

代码语言: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;
}
票数 2
EN

Stack Overflow用户

发布于 2013-03-01 16:29:05

代码语言:javascript
复制
/[().]+/g

将匹配所有看起来像RNA第二结构的东西(即,点和括号的连续序列)。您应该首先使用此正则表达式查找可能的匹配项。

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

代码语言:javascript
复制
if (submatch.indexof(".") != -1)

但您无法检查括号是否正确平衡-为此,您需要nhahtdh建议的解析器。

票数 1
EN

Stack Overflow用户

发布于 2013-03-01 16:26:13

这里的问题是,您实际需要匹配的是:

代码语言:javascript
复制
a = . | .(a) | (a). | .a | a.

为什么用正则表达式解决这个问题即使不是不可能,也很难,主要的问题是,对于每个左括号,必须有一个闭括号。

使用JavaScript应该可以做到这一点。你需要这样做:

将括号计数器设置为0。遍历整个结构。当找到左括号时,增加计数器。如果找到右括号,请减小计数器。

如果在解析结束时计数器回到零,则结构是ok的。现在唯一缺少的就是所需的点。为此,我将引入另一个变量justOpened或类似的变量。找到左括号时,将其设置为true。当您找到一个点时,将其设置为false。如果你找到一个闭括号,并且你的变量是true,你可以中止,因为你的结构被破坏了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15153301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档