java - 模式编译.*?与.*

标签 java

我发现了差异,但无法解释:

public static void main(String[] args) {
    Pattern p = Pattern.compile("[+-]?\\d+.*?");
    Matcher m = p.matcher("+5.0h");
    System.out.println(m.matches());                                  //prints true

    Scanner in = new Scanner("+5.0h");
    while (in.hasNext()) {
        if (in.hasNext(p)) {
            System.out.println(in.findInLine(p));                      //prints +5
        }
    }
    in.close();

    System.out.println("6.0hgf".matches("[+-]?\\d+.*?"));   //prints nothing,it seemed that this sentence didn't execute,why this happened?
}  

当我改变

Pattern p = Pattern.compile("[+-]?\\d+.*?")

Pattern p = Pattern.compile("[+-]?\\d+.*")

发生了以下情况:

public static void main(String[] args) {
    Pattern p = Pattern.compile("[+-]?\\d+.*");
    Matcher m = p.matcher("+5.0h");
    System.out.println(m.matches());                                  //prints true

    Scanner in = new Scanner("+5.0h");
    while (in.hasNext()) {
        if (in.hasNext(p)) {
            System.out.println(in.findInLine(p));                      //prints +5.0h
        }
    }
    in.close();

    System.out.println("6.0hgf".matches("[+-]?\\d+.*?"));   //prints true
} 

所以我想知道为什么会发生这种情况?

最佳答案

* 的默认行为是尽可能多地匹配,并在其后面添加 ? 以确保仅匹配必要的数量。

对于前:

如果我有字符串 "abc" 并且使用 .* ,它将匹配整个字符串,但如果我将正则表达式更改为 .*? 它不会匹配任何内容,因为 * 是 0 或更多。

我们还可以以 + 为例,其中如果字符串再次为 "abc" 并且正则表达式为 .+ 它将匹配整个字符串,但如果正则表达式为 .+? ,它将仅匹配一个字符,在本例中为 a

关于java - 模式编译.*?与.*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33840802/

相关文章:

java - 让 Hibernate 忽略未映射的实例变量

java - 从二进制数据中提取某些位

Java 2D 游戏图形

java - 配置 WSO2 API 管理器自定义身份 validator 和声明

java - 底部导航栏未在 Activity 中显示

java.sql.SQLException 参数索引超出范围(1 > 参数数量,即 0)

java - 创建一个扩展 keyListener 的类

java - 取消部署 JBoss Drools 应用程序时出现异常

java - onActivityResult 在 API 级别 17 下未调用

java - 关于weblogic portlets功效的一个问题