目标
google aviator regex 正则表达式提取
官方文档
AviatorScript 中正则表达式也是一等公民,作为基本类型来支持, /
括起来的正则表达式就是一个 java.util.Pattern 实例,例如 /\d+/
表示 1 个或者多个数字,正则表达式语法和 java 完全相同,但是对于需要转义的字符不需要连续的反斜杠 \\
,只要一个 \
即可,比如我们要匹配 .av
为结尾的文件,正则可以写成 /^.*\.av$/
,这里的 \.
来转义后缀里的 .
符号。
正则表达式能参与的运算只有比较运算符和正则匹配运算符 =~
:
[js]
1
2
3
4
5
6
7
8
9
10## examples/regexp.av
let p = /^(.*)\.av$/;
println(p == p); ## print true
println("regexp.av" =~ p); ##print true
println("$0=" + $0);
println("$1=" + $1);
我们定义了一个正则表达式 p,用于匹配以 .av 结尾的文件名,匹配是用 =~ 运算符,匹配运算符左侧是字符串,右侧是正则表达式,如果匹配成功,返回 true,否则返回 false。
这里 regexp.av 是匹配成功,因此打印 true , 如果匹配成功,同时 AviatorScript 会将正则中的匹配的分组放入 0,1 , 2…的变量中,其中0 表示匹配的整个字符串,而 $1 表示第一个分组,以此类推。这里就是文件名,正则中用括号括起来的第一个分组 (.*)
。
因此上面将打印:
实际测试
maven
[xml]
1
2
3
4
5
6
7<dependencies>
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.4.3</version>
</dependency>
</dependencies>
测试
[java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32package org.example;
import com.googlecode.aviator.AviatorEvaluator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
/**
* 给出 Java 中提取包路径+异常名的正则。比如 java.lang.NumberFormatException。com.alibaba.FastJsonException
* googlecode aviator 5.4.3,
*
* 形如:
*/
public static void main(String[] args) {
String input = "哈哈哈哈\n Caught exception: java.lang.NumberFormatException at line 42. Another one: com.alibaba.FastJsonException. 哈哈哈哈\n";
Map<String, Object> env = new HashMap<>();
env.put("input", input);
// 正则表达式,异常类名前后可以有任意内容
String script = "input =~ /([\\s\\S]*?)([a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)+Exception)([\\s\\S]*)/; return $2;";
Object result = AviatorEvaluator.execute(script, env);
// 输出匹配到的异常类名
System.out.println(result); // 输出: java.lang.NumberFormatException
}
}
这里需要加一下 ([\\s\\S]*?)
将无关的内容移除掉。
参考资料
https://www.yuque.com/boyan-avfmj/aviatorscript/guhmrc