【问题标题】:Problem with matching token in a line, using Scanner in Java使用Java中的Scanner在一行中匹配令牌的问题
【发布时间】:2010-11-16 12:52:34
【问题描述】:

我需要匹配输入文本行中的某些内容。线条如下所示:

 to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}

我正在使用 Scanner 类来读取文本的每一行,并且我编写了以下代码。但是,有些东西不能正常工作,因为模式“to”与该行不匹配,它应该是,因为“to”包含在该行中(我尝试不仅匹配该行中的“to”,但没有匹配项):

 Scanner scanner = new Scanner(file);
 while(scanner.hasNext()) {
      String line = scanner.nextLine();
      System.out.println("line: " + line);
      Pattern p_pos = Pattern.compile("to");
      Matcher m_pos = p_pos.matcher(line);
      String match = m_pos.group(0);
      System.out.println("match: " + match);
      boolean b_pos = m_pos.matches();
      if(b_pos) {
          System.out.println(match);
      }
 }

输出:

line:    to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}
Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:485)
    at lady.PhrasesFromFile.readFile(PhrasesFromFile.java:31)
    at lady.PhrasesFromFile.main(PhrasesFromFile.java:17)

我还有一个问题:如何处理该行,以便存储从行首到第一个“/”符号的所有内容?我在 API 中找不到任何方法。有可能这样做吗?我基本上想连续遍历该行,将行的各个部分存储在不同的变量中,然后使用这些变量的值。由于我不知道在第一个“/”符号之前有多少个标记,因此我无法使用 next() 一定次数。

提前谢谢你。

【问题讨论】:

    标签: java regex java.util.scanner


    【解决方案1】:

    您可以使用以下方法提取令牌所需的部分:

    String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1);
    

    然后循环使用以提取令牌

    Pattern.compile("\\w+").matcher(tokenSection).find();
    

    显然,您不会直接插入上述代码。

    【讨论】:

      【解决方案2】:

      .matches() 尝试匹配 整个 输入字符串。如果要匹配输入字符串的一部分,请使用.find(),如果要匹配输入字符串的开头,请使用.lookingAt()

      http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

      此外,如果您扩展您的模式以包括匹配组(有关匹配组如何工作的更多详细信息,请参阅通用正则表达式参考),您可以在成功匹配后使用 .group() 函数来检索与特定匹配的子字符串在模式中分组。

      【讨论】:

        猜你喜欢
        • 2017-05-23
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多