java - 我对 java.util.Scanner 做错了什么?

标签 java

这是我的 Java 1.5 代码(完整示例):

import org.junit.Test;
import static org.junit.Assert.*;
import java.util.Scanner;
import java.util.regex.Pattern;
public class StrangeTest {
  @Test
  public void testRegExp() {
    Pattern re = Pattern.compile("(;|:)[^:;]*");
    Scanner scanner = new Scanner(":alpha");
    scanner.useDelimiter("");
    assertEquals(":alpha", scanner.next(re)); // failure
  }
}

这里有什么问题吗?

最佳答案

基本上,您的正则表达式匹配任何以 : 开头的字符串,即使它只是一个字符:: 匹配表达式以及 :a , :al, ... :alpha。甚至 :alpha;beta 也是一场比赛!

用你在表达式后附加的问号,你做到了 non-greedy ,即匹配最短可能的字符串,即:

删除问号使其贪婪:

Pattern re = Pattern.compile("(;|:).*");

但是,它会匹配 :alpha;beta,因此您需要指出,在分号或冒号字符之后,您期望任何字符 except 分号或冒号:

Pattern re = Pattern.compile("(;|:)[^;:]*");

关于java - 我对 java.util.Scanner 做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3776893/

相关文章:

java - Spring Boot 与 H2 数据库自动创建

java - Android 正则表达式不符合我的预期

java - 如何在嵌入式 Jetty 8 中部署 WAR?

java - Java中的异常线程中的异常 "AWT-EventQueue-0"java.lang.NullPointerException

java - Selenium:如何在 Firefox 中禁用 webdriver ="true"?

java - JTable 键绑定(bind)

java - 单击按钮后如何停止 "SPLASH_TIME"?

java - ZKSpring 如何从 Spring MVC Controller 向 ZK zul 传递变量?

java - 访问空格后的字符

java - zxing ean13 条码编码 'lead' , 'separator' 和 'trailer'