如何在Painless脚本中获取字符串内第一个数字的索引?
问题根因
Painless 是基于 JVM 的脚本语言,直接调用java.lang.String的原生方法,该类不存在search()这个JS风格的正则匹配方法,因此运行时会抛出方法不存在的错误。
可行实现
方案1:字符遍历(推荐)
不需要依赖正则,性能最优,无语法兼容问题,逻辑为逐位遍历字符,找到第一个数字的索引后截取前缀:
def str = doc['index.keyword'].value; def value = ""; if (str != null && !str.isEmpty()) { int firstNumPos = -1; for (int i = 0; i < str.length(); i++) { if (Character.isDigit(str.charAt(i))) { firstNumPos = i; break; } } value = firstNumPos == -1 ? str : str.substring(0, firstNumPos); } return value;
该逻辑会自动兼容无数字的场景:如果字符串全程没有数字,会直接返回完整原字符串,不会出现索引越界问题。
方案2:正则匹配
如果需要用正则实现,Painless 原生支持Pattern/Matcher正则API,写法如下:
def str = doc['index.keyword'].value; def value = ""; if (str != null && !str.isEmpty()) { Pattern digitPattern = /[0-9]/; Matcher matcher = digitPattern.matcher(str); if (matcher.find()) { value = str.substring(0, matcher.start()); } else { value = str; } } return value;
注意:Painless 内置正则安全拦截机制,复杂度过高的正则会被直接拒绝执行,简单字符判断场景优先选择遍历方案,性能更高也无拦截风险。
内容的提问来源于stack exchange,提问作者NiveditaK
相关产品推荐
相关产品推荐

