javascript - 括号regexp / parser

时间:2012-02-09 13:17:10

标签: javascript regex

我在javascript中遇到以下问题:我想删除字符串中不匹配的括号,因此没有嵌套。

我已从字符串中删除了[^a-z\-()]以外的所有内容。 只应移除()。 我认为这描述了我想要发生的事情。

  1. 如果在开始时未打开),请删除)
  2. 如果在结尾处未公开(,则将)附加到字符串
  3. 对于每个(,请预览下一个)并删除之前的所有(
  4. 对于每个),在下一个)发生之前,不应再有(
  5. 删除任何包含0或1个字符的(),但这可以单独完成。
  6. 因此a)b()(c)(de)f(g(h)i)j)(k变为abc(de)f(gh)ijk

    a(bc变为a(bc)

    我还希望只保留括号中的唯一字符,但这可以在以后完成

    所以aa(bb变为aa(bb)然后aa(b)然后aab

    正则表达式是最好的方法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式来强制执行规则#3& #5但其他人虽然技术上可行但是很难。代码应该更容易编写为处理字符流或迭代字符串,就好像它是一个字符数组。你只需跟踪你所处的状态......

虽然正则表达式很棒但它并不总是最好的工具。

答案 1 :(得分:0)

您将需要一个Parser,例如:

function gets(s, depth) {
    var out = '';

    while (s.length) {
        var c = s.shift();
        if (c == '(') {
            var p = gets(s, depth + 1);
            if (!depth && p.length > 1)
                p = '(' + p + ')'
            out += p;
        } else if (c == ')') {
            if (depth)
                return out;
        } else {
            out += c
        }
    }
    return out;
}


str = "So a)b()(c)(de)f(g(h)i)j)(k"
result = gets(str.split(""), 0)