aviatorscript icon indicating copy to clipboard operation
aviatorscript copied to clipboard

正则表达式贪婪匹配问题

Open Yowe opened this issue 3 years ago • 2 comments

let s = '甲状腺组织一块,大小约4cm×3.8cm×1.5cm,切面见一个灰白色边界不清肿物,大小约1.5cm×1.4cm×5cm' let p = /甲状腺.?肿物.?大小.*?(\d+.?\d?)cm/; if s =~ p{ println($1); return $1; }else{ return nil; }

输出:5 使用java Pattern类匹配返回的是1.5 问题:是不是不支持非贪婪匹配?

Yowe avatar Jul 25 '22 08:07 Yowe

理论上应该是一样,因为 aviator 内部也用的是 java 的 Pattern 类来编译正则。

killme2008 avatar Aug 01 '22 07:08 killme2008

理论上应该是一样,因为 aviator 内部也用的是 java 的 Pattern 类来编译正则。

我看aviator内部源码用的matcher方法匹配,我matcher和find这两个方法匹配后返回的结果不太一样, matcher方法源码注释是这样写的:Attempts to match the entire region against the pattern Pattern pattern = Pattern.compile("甲状腺.?肿物.?大小.?(\d{1,2}\.\d{0,3})cm"); Matcher matcher = pattern.matcher("甲状腺组织一块,大小约4cm×3.8cm×1.5cm,切面见一个灰白色边界不清肿物,大小约1.5cm×1.4cm×5cm");

    while (matcher.find()){
        System.out.println(matcher.group(1));  这里输出1.5
    }
    if (matcher.matches()){
        int groupCount = matcher.groupCount();
        for (int i = 0; i <= groupCount; i++) {
            System.out.println(matcher.group(i)); 这里输出5
        }
    }

Yowe avatar Aug 19 '22 08:08 Yowe