【问题标题】:Java String split not returning the right valuesJava字符串拆分未返回正确的值
【发布时间】:2011-08-06 06:01:38
【问题描述】:

我正在尝试解析一个 txt 文件,该文件表示要在递归下降解析器中使用的语法。 txt 文件看起来像这样:

SPRIME ::= 表达式
Expr ::= 期限 Expr'
Expr' ::= + 术语 Expr' | - 期限Expr' | e

为了隔离左侧并将右侧拆分为单独的生产规则,我取每一行并调用:

String[] firstSplit = line.split("::=");
String LHS = firstSplit[0];
String productionRules = firstSplit[1].split("|");

但是,当我调用第二个拆分方法时,我没有返回一个由“|”分隔的字符串数组字符,而是右侧每个单独字符的数组,包括“|”。例如,如果我正在解析 Expr' 规则并打印 productionRules 数组,它将如下所示:

“+”
“术语”
“Expr”
""
"|"

我真正想要的应该是这样的:

  • Term Expr'

有人知道我做错了什么吗?

【问题讨论】:

    标签: java parsing string


    【解决方案1】:

    String.split()的参数是正则表达式,竖线字符比较特殊。

    尝试用反斜杠转义:

    String productionRules = firstSplit[1].split("\\|");
    

    注意:需要两个反斜杠,因为反斜杠字符本身在字符串文字中是特殊的。

    【讨论】:

    • 非常感谢,我知道这与正则表达式有关,现在可以享用了!
    • 这里的传统做法是为正确答案投票并“接受”您最喜欢的答案。
    • 目前有 11 个代表,@Richard 实际上还不能投票。但接受答案肯定是有礼貌的。
    • 时间久了我都忘了:)
    【解决方案2】:

    由于split 将正则表达式作为参数,因此您必须转义所有非预期的正则表达式符号。

    【讨论】:

      【解决方案3】:

      您需要转义 pipe(|) 符号,它是 regex OR 运算符。

      String productionRules = firstSplit[1].split("\\|");
      

      String productionRules = firstSplit[1].split(Pattern.quote("|"));
      

      【讨论】:

        【解决方案4】:

        管道字符是“或”的正则表达式运算符。你想要的是

        String productionRules = firstSplit[1].split("\\|");
        

        告诉它寻找一个实际的管道字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-29
          • 1970-01-01
          • 1970-01-01
          • 2022-08-19
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          相关资源
          最近更新 更多