【问题标题】:Java regex for hasNext() that matches end of next匹配下一个结尾的 hasNext() 的 Java 正则表达式
【发布时间】:2013-10-28 01:02:13
【问题描述】:

假设我从输入文件构造了一个新的 Scanner

Scanner aScanner = new Scanner(new FileReader("file.txt"));

file.txt 有多个这样的行

blah blah blah blah
blah blah blah

我想检查 Scanner 是否有与我的模式匹配的下一个值:

 aScanner.hasNext("blah");

效果很好。但是,当我尝试使用行尾字符 $:

 aScanner.hasNext("blah$");

失败了。当我标记多行(?m)时,它甚至会失败。然后我意识到 $ 匹配字符串的结尾或输入的结尾,这两种情况都不是(除了最后)。鉴于此,我将如何匹配下一个输入的结尾?

【问题讨论】:

    标签: java regex java.util.scanner


    【解决方案1】:

    传递给hasNext()的参数是分隔符的模式,然后在调用next()使用

    尝试使用后视:

    aScanner.hasNext("(?<=blah)\\s+");
    

    这表示使用空格作为分隔符,但前提是前面有“blah”,尽管这会消耗所有内容,直到“blah”,并根据需要跳过其他字符。

    【讨论】:

      【解决方案2】:

      hasNext("blah$") 只能在下一个标记是字符串“blah”后跟文件结尾(或带有(?m) 的行结尾)时匹配。

      这可能是有启发性的:

      public static void main(String[] args) {
          Scanner s = new Scanner(new StringReader("blah blah\nblah blah"));
          for (int i = 0; i < 4; i++) {
              System.out.println(s.hasNext("blah"));
              System.out.println(s.hasNext("blah$"));
              System.out.println(s.hasNext("(?m)blah$"));
              s.next();
          }
      }
      

      那里有四个废话。第一个仅与hasNext("blah") 匹配。第二个与 hasNext("(?m)blah$") 匹配,因为它位于行尾。第三个再次仅与hasNext("blah") 匹配。第四个匹配所有条件,因为它既位于行尾,又位于文件末尾。

      【讨论】:

      • 那么没有字符表示 hasNext() 值的结束,它既不是行尾也不是文件的结尾?
      • 我想我不明白你的问题。也许您可以明确说明您要达到的目标,而不是说不起作用
      猜你喜欢
      • 2016-03-26
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多