3

所以我有这个文本文件

\begin{document}
    {\Large \begin{center} Homework Problems \end{center}}\begin{itemize}\item\end{itemize}
    \begin{enumerate}
                    \begin{proof}
                            \begin{align}

                            \end{align}
                    \end{proof}

                    \begin{proof}

                            \begin{align}

                            \end{align}

                    \end{proof}
    \end{enumerate}
\end{document}

我想遍历每一行,找到所有的“\begin”片段,然后在“{ _ }”中取出字符串并将其存储在堆栈中。当找到相应的“\end”时,我在堆栈上调用 pop() 命令并将其删除。不过我有几个问题...

  1. 我正在处理各种疯狂的案例,并确保所有内容都被容纳,并且当我想让它适用于所有这样编写的文件时,它变得过于特定于这种情况。
  2. 我不知道如何检查“\begin”和“\end”而不是“begin”和“end”,这很重要的原因是因为如果文件包含“begins”或“end”的文本它可能不是命令,因此不是我要找的。

由于存在“\”,所有“if”语句都不起作用,我尝试添加方括号,但它没有解决任何问题。

到目前为止,这是我的代码,它变得非常混乱,任何人都可以帮助组织和帮助纠正我上面提到的问题吗?

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;

public class LaTeXParser{

public static void main(String args[]) throws FileNotFoundException{

    Scanner scan = new Scanner(System.in);

    Stack s = new Stack();

    int lineCount = 0;

    String line;
    String nextData = null;
    String title = null;

            String fname;

            System.out.print("Enter the name of the file (no extension): ");
            fname = scan.next();

            fname = fname + ".txt";

            FileInputStream fstream = new FileInputStream(fname);

            Scanner fscan = new Scanner(fstream);

            System.out.println();

            while(fscan.hasNextLine()){

                lineCount++;
                line = fscan.nextLine();
                StringTokenizer tok = new StringTokenizer(line);

                while(tok.hasMoreElements()){

                    nextData = tok.nextToken();
                    System.out.println("The line: "+nextData);

                    if(nextData.contains("\\begin") && !nextData.contains("\\end")){

                        if(nextData.charAt(1) == 'b'){

                            title = nextData.substring(nextData.indexOf("{") + 1, nextData.indexOf("}"));

                            s.push(title);

                        }

                        else{

                            //title = nextData.substring();

                        }
                    }//end of BEGIN if

                    if(nextData.contains("\\end") && !nextData.contains("\\begin")){

                        if(s.peek().equals(nextData.substring(nextData.indexOf("{") + 1, nextData.indexOf("}")))){

                            s.pop();

                        }
                    }//end of END if

                    if(nextData.contains("\\begin") && nextData.contains("\\end")){

                        String[] theLine = nextData.split("[{}]");

                        for(int i = 0 ; i < theLine.length ; i++){

                            if(theLine[i].equals("\\end") && theLine[i+1].equals(s.peek())){

                                s.pop();

                            }

                            if(theLine[i].equals("\\begin")){

                                title = theLine[i+1];

                                s.push(title);

                            }


                        }

                    }//end of BEGIN AND END if

                }
            }//end of whiles

            fscan.close();

    while(!s.isEmpty()){

        System.out.println("the top "+s.pop());

    }
}
}

编辑:在用于检查一行以查看它是否在找到“\begin”后同时包含“\begin”和“\end”的 if 语句中,我如何回过头来检查该行是否也包含它是“\结束”?所以我说的是这个案子……

\begin{itemize}\item\end{itemize}

看我可以到达“\begin”并添加正确的字符串,但它只是移动并通过“\end{itemize}”。有任何解决这个问题的方法吗?

实际上,即使在“itemize”字符串被推送后,它也应该检查并正常执行,但它不起作用!我相信它与“\end”有关,有人可以确认吗?它跳过了这一步,显然是因为它不符合条件,但它适用于其他行。只是没有这个具体案例!

4

1 回答 1

1

你可能需要转义反斜杠,所以写\\而不是\. 如果它们在正则表达式(regexprs)中,则需要将它们转义两次\\\\:我认为不需要括号。

于 2013-03-12T06:17:38.070 回答