当前位置: 首页 > 知识库问答 >
问题:

正则表达式可以找到平衡的括号模式吗?

海翼
2023-03-14

我在Java的一次采访中被问到这个问题。我不能解决它,但我猜它可以解决使用正则表达式。不确定是否有一种不使用正则表达式的替代方法。有人能帮我用正则表达式吗?或者,如果不使用正则表达式就能解决这个问题。

给定一个平衡括号字符串(它只包含[],并且它已经平衡),我需要查找它内部是否包含模式[*][*][*](*表示一个或多个平衡括号表达式)。也就是说,检查它是否在任何[]中包含3个或更多的[]

示例:

对于[[][[][][]]],预期答案为true,因为其内部包含[][][]

对于[[]][[]]预期答案为false,因为它的连续[]少于3个

对于[[]][][[]]],预期答案为true,因为其内部包含[..][][..]。如果[]内部有0个或更多的[]则无关紧要。

共有1个答案

林泰平
2023-03-14

正则表达式不是解决这类问题的方法。由于递归,它们不能特别好地处理嵌套结构。

例如,对于使用堆栈(FILO)来说,这是一个完美的问题。我建议你看看那些。

class Node
{
    private final Node parent;
    private final List<Node> subNodes = new LinkedList<>();

    Node(Node parent)
    {
        this.parent = parent;
    }

    static Node buildFrom(String str)
    {
        Node start = new Node(null);
        Node current = start;

        for (char ch : str.toCharArray())
        {
            if (ch == '[') //Create new subnode
            {
                Node newNode = new Node(current);
                current.subNodes.add(newNode);
                current = newNode;
            }
            else //Step back
            {
                current = current.parent;
            }
        }
        return start;
    }

    boolean hasTripleNodes()
    {
        if (this.subNodes.size() >= 3) //Found triple+ nodes
        {
            return true;
        }
        else //Continue recursion
        {
            for (Node subNode: this.subNodes)
            {
                if (subNode.hasTripleNodes())
                {
                    return true;
                }
            }
            return false;
        }
    }

    //DEMO
    public static void main(String[] args) throws Exception {
        Node nodes = Node.buildFrom("[[][[][][]]]");
        System.out.println(nodes.hasTripleNodes()); //writes true

        nodes = Node.buildFrom("[[]][[][]]");
        System.out.println(nodes.hasTripleNodes()); //writes false

        nodes = Node.buildFrom("[[[]][][[]]]");
        System.out.println(nodes.hasTripleNodes()); //writes true
    }
}
 类似资料:
  • 我需要编写正则表达式,以特殊符号捕获类型name的泛型参数(也可以是泛型的),如下所示: 假设类型名是,参数是,所以我只需要抓取,和 基本上,如果平衡组堆栈是空的,我需要采取一些措施,但我真的不明白怎么做。 UPD 下面的答案帮助我快速解决了这个问题(但没有适当的验证,深度限制=1),但我通过团队平衡成功地解决了这个问题: 演示 UPD2(上次优化)

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 我需要一种使用RegEx搜索文本并在Latex命令中找到一个单词的方法(这意味着它在花括号内) 这是一个例子: 现在如果你搜索正则表达式:,并将其替换为< code>$1T~a~r~z~a~n$3 这将只替换花括号中的泰山这个词,而忽略另一个实例!这是我来的最远的地方。 现在我需要的是对下面的例子做同样的事情: 在这个例子中,我只需要最后提到的“泰山”被替换(\grk{}中的那个) 有人可以帮助我

  • 我需要通过不在括号中的管道拆分文本。这是示例文本 我在这里找到了这个/\ |(?![^{]*})/g:regex,提取字符串,不要在两个括号之间 现在当我想用管子分割这部分字符串时 它还选择杰森、玛丽亚和圣诞老人之间的管道,因为它们后面有一个开口支架。如果正则表达式不在任何括号中,如何将其更改为仅匹配管道。 测试字符串: 应该返回 . 应该返回

  • 问题内容: 我一直试图在Java中编写一个正则表达式以删除下面括号中的所有内容,同时保留其他所有内容。 注意,括号可以嵌套,这就是为什么我的模式失败的原因 。有人能帮我吗?下面我试过了: 但这打印: d4 Nf6 2. c4 g6 3. Nc3 Bg7 4. e4 d6 5. Nf3 OO 6. Be2 e5 7. dxe5 dxe5 8. Qxd8 Rxd8 9. Bg5 Nbd7 10. OO

  • 我需要编写一个具有以下规则的正则表达式: null null 这些示例无效: > 12--11(因为它包含两个连字符) 1-2345(因为它包含5号) <>是字符出现在最后一个位置,那么在字符之前必须有一个数字not hypen。 即11-A(必须不及格)11-1A(必须及格)