Algorithm 如何在给定文本中找到匹配括号或大括号的位置?

Algorithm 如何在给定文本中找到匹配括号或大括号的位置?,algorithm,Algorithm,许多文本编辑器和IDE都有一个特性,当光标放置在其中一对中的开始字符或结束字符上时,会高亮显示匹配的括号、方括号或大括号 给定文本文件中的左括号或右括号的位置,使用什么算法查找匹配括号的位置?请记住,这些字符可以嵌套,因此仅向前或向后扫描文本,直到找到相反的字符是不够的 示例: 我最近在用Java编写解释器时遇到了这个问题[和]类似于while循环,可以嵌套。解释器需要根据数据指针上的值查找匹配的[或]。有关嵌套的说明,请参见。给定开括号在字符数组中的位置,有一个简单的算法,使用计数器查找匹配的

许多文本编辑器和IDE都有一个特性,当光标放置在其中一对中的开始字符或结束字符上时,会高亮显示匹配的括号、方括号或大括号

给定文本文件中的左括号或右括号的位置,使用什么算法查找匹配括号的位置?请记住,这些字符可以嵌套,因此仅向前或向后扫描文本,直到找到相反的字符是不够的

示例:


我最近在用Java编写解释器时遇到了这个问题<该语言中的code>[和
]
类似于while循环,可以嵌套。解释器需要根据数据指针上的值查找匹配的
[
]
。有关嵌套的说明,请参见。

给定开括号在字符数组中的位置,有一个简单的算法,使用计数器查找匹配的闭括号

  • 将计数器初始化为1
  • 循环向前(向右)浏览文本。
    • 如果遇到另一个开括号,则递增计数器
    • 如果遇到右括号,则减小计数器
  • 当计数器达到零时,您找到了匹配的右括号
在代码中,这类似于:

public int findClosingParen(char[]text,int openPos){
int closePos=openPos;
int计数器=1;
而(计数器>0){
字符c=文本[++closePos];
如果(c=='('){
计数器++;
}
如果(c=='),则为else){
计数器--;
}
}
返回closePos;
}
在给定右括号的情况下,查找匹配的开括号位置的算法正好相反

  • 将计数器初始化为1
  • 在文本中向后(向左)循环。
    • 如果遇到开括号,则减小计数器
    • 如果遇到右括号,则递增计数器
  • 当计数器达到零时,您找到了匹配的开括号
代码:

public int findOpenParen(字符[]文本,int closePos){
int openPos=closePos;
int计数器=1;
而(计数器>0){
字符c=文本[--openPos];
如果(c=='('){
计数器--;
}
如果(c=='),则为else){
计数器++;
}
}
返回openPos;
}
注意:以上两个示例都假设括号是平衡的,因此不进行数组边界检查。真正的实现将检查您是否没有从数组末尾运行,并抛出一个异常(或返回一个错误代码),如果您这样做,则表明括号在输入文本中不平衡。

private String GetJsonFromString(字符串源,字符串标记名)
private String GetJsonFromString(String source, String tagName)
    {
        int tagIndex = source.IndexOf(tagName);
        if (tagIndex < 0) return "";
        string rightSource = source.Substring(tagIndex).Trim();

        int openBrackeIndex = rightSource.IndexOf("{");
        if (openBrackeIndex < 0) return "";
        rightSource = rightSource.Substring(openBrackeIndex).Trim();

        int closePos = 0;
        int counter = 1;
        while (counter > 0)
        {
            char c = rightSource.ToCharArray()[++closePos];
            if (c == '{')
            {
                counter++;
            }
            else if (c == '}')
            {
                counter--;
            }
        }
        return rightSource.Substring(0, closePos + 1);
    }
{ int tagIndex=source.IndexOf(标记名); 如果(tagIndex<0)返回“”; string rightSource=source.Substring(tagIndex.Trim(); int openBrackeIndex=rightSource.IndexOf(“{”); 如果(openBrackeIndex<0)返回“”; rightSource=rightSource.Substring(openBrackeIndex.Trim(); int closePos=0; int计数器=1; 而(计数器>0) { char c=rightSource.ToCharArray()[++closePos]; 如果(c=='{') { 计数器++; } else如果(c=='}') { 计数器--; } } 返回rightSource.Substring(0,closePos+1); }
这是一个很棒的函数账单。但是,如果没有匹配的括号,它会绕一个无限循环。很容易修复:public int findClosingParen(char[]text,int openPos){int closePos=openPos;int counter=1;while(counter>0){char c=text[++closePos];if(c=='(')){counter++;}else如果(c=='){counter--;}}返回closePos;}问得好,回答得好,这正是我所需要的。你们都得到了+1。你们两个应该有时间聚在一起;我打赌你们会相处得很好。如果没有括号,你需要打破循环,因为你会得到无限循环。如果你的语言支持字符串文字,也不要忘记忽略它们,因为它们可能包含不平衡的字符串括号的数量。|你们俩应该找个时间出去玩,我打赌你们会相处得很好。