【问题标题】:Parsing string using the Scanner class使用 Scanner 类解析字符串
【发布时间】:2012-08-20 05:33:43
【问题描述】:

我正在尝试解析一些行并检查它们的值,例如在字符串中:

   " 1 ON OFF";

我必须检查是否:

  • 第一个字符为空白。
  • 第二个字符是 int。
  • 第三个字符为空白。
  • 第四个字符为 2 个字符,为 ON。
  • 第五个字符为空白。
  • 第六个字符为3个字符,为OFF。

我可以使用正则表达式一次性完成,但我想要的是每次检查后我必须显示是否正确:

   System.out.println("1st character is not a blank : incorrect");
   System.out.println("1st character is blank : correct");

我想为此使用Scanner 类,但是当我尝试检测第一个字符时,它显示1 而不是字符串的空白,

   " 1 ON OFF";

   public class NewClass {    

    public void StringExample(){
        String str = " 1 ON OFF";

        Scanner sc = new Scanner(str);
        System.out.println(sc.next());
    }

    public static void main(String args[]){
        NewClass nc = new NewClass();
        nc.StringExample();
    }
}

在java中有没有其他类可以轻松做到这一点?

【问题讨论】:

  • 你真的需要检查空白吗?只需先修剪您的输入字符串并使用带有默认分隔符的扫描仪,您将获得[1, "ON", "OFF"] 令牌。

标签: java regex


【解决方案1】:

我能想到的最接近的是按字边界分割:

String tokens[] = " 1 ON OFF".split("\\b");

它将给出以下数组:

{ " ", "1", " ", "ON", " ", "OFF" }

它符合您的顺序和您对第 1-6 个“字符”的定义。

【讨论】:

  • 谢谢,nhahtdh。这就是我一直在寻找的。​​span>
【解决方案2】:

值得一看 StringReader,它可以让您逐个字符地扫描字符串。另一种选择是简单地读取每个字符 (String#charAt) 并检查它是否符合您的规则。

【讨论】:

    【解决方案3】:

    尝试使用String.split(" ") 来分割空格。你会得到一个数组,如果第一个字符是空白的,那么数组中的第一个String 将是一个空字符串:

    String strs[] = " 1 ON OFF".split(" ");
    

    通过此示例,您将获得以下数组:["", "1", "ON", "OFF"]

    如果第一个字符是空格,您将获得空字符串作为第一个元素。如果有 2 个前导空格,那么您将看到空字符串作为前两个元素。剩余的字符串将是原始字符串中以空格分隔的标记,但如果标记之间有额外的空格,那么您将看到额外的空字符串作为数组元素。

    循环遍历生成的数组,包括数字的parseInt,您将能够匹配您描述的规则。

    请注意,您可以使用Scanner 对字符串进行类似的标记,方法是将分隔符设置为空字符串:

    Scanner sc = new Scanner(str);
    sc.useDelimiter("");
    System.out.println(sc.next());
    

    【讨论】:

      【解决方案4】:

      您可以使用parboiled 并声明一个小语法。

      【讨论】:

        【解决方案5】:

        另一种选择:

        public static void main(String[] args) throws IOException
            {
        
                String patternString = " 1 ON OFF";
                boolean pass = true;
        
                    if (patternString.charAt(0) != ' ' && patternString.charAt(2) != ' ') {
                        pass = false;
                    }
        
                    int digit = Character.getNumericValue(patternString.charAt(1));
        
                    if (digit < 0 && digit > Integer.MAX_VALUE) {
                        pass = false;
                    }
        
                    if (patternString.charAt(3) != 'O' && patternString.charAt(4) != 'N') {
                        pass = false;
                    }
        
                    if (patternString.charAt(5) != ' ' && patternString.charAt(6) != 'O' && patternString.charAt(7) != 'F' && patternString.charAt(8) != 'F') {
                        pass = false;
                    }
        
                    if (pass) {
                        System.out.println("Validation pass");
                    }
            }
        

        【讨论】:

          猜你喜欢
          • 2010-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-22
          • 2012-08-06
          相关资源
          最近更新 更多