【问题标题】:Parsing a string, Grammar file解析字符串,语法文件
【发布时间】:2010-03-09 03:35:06
【问题描述】:

我如何将下面的字符串分成几个部分。我需要分开的是每个 包括字符串其余部分的尖括号。所以在下面的情况下,我会得到几个字符串 1.“我必须和你分手,因为” 2.“”(没有空格) 3.”。但我们还是“4.” “ 5.” 。”

I have to break up with you because <reason> . But let's still <disclaimer> .

下面是我目前拥有的(它丑陋...)

boolean complete = false;
    int begin = 0;
    int end = 0;
        while (complete == false) {
        if (s.charAt(end) == '<'){
            stack.add(new Terminal(s.substring(begin, end)));
            begin = end;
        } else if (s.charAt(end) == '>') {
            stack.add(new NonTerminal(s.substring(begin, end)));
            begin = end;
            end++;
        } else if (end == s.length()){
            if (isTerminal(getSubstring(s, begin, end))){
                stack.add(new Terminal(s.substring(begin, end)));
            } else {
                stack.add(new NonTerminal(s.substring(begin, end)));
            }
            complete = true;
        }
        end++;

【问题讨论】:

    标签: java parsing grammar text-parsing


    【解决方案1】:

    看看使用StringTokenizer

    【讨论】:

      【解决方案2】:

      实际上使用BreakIterator 会是更好的方法。

      BreakIterator 类还提供 静态 getCharacterInstance(), getWordInstance 和 getLineInstance() 方法。这些方法返回 BreakIterator 实例允许您 解析字符、单词和 线级,分别。

      【讨论】:

        【解决方案3】:

        使用正则表达式。

        for (String token : text.split("(?=<)|(?<=>)")) {
            boolean isNT = token.startsWith("<");
            System.out.format("%s |%s|%n", isNT ? "NT" : " T", token);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-18
          • 1970-01-01
          • 2021-06-23
          • 1970-01-01
          • 1970-01-01
          • 2021-12-05
          • 1970-01-01
          相关资源
          最近更新 更多