如何在第 n 次出现配置单元之前进行 regexp_extract

Posted

技术标签:

【中文标题】如何在第 n 次出现配置单元之前进行 regexp_extract【英文标题】:how to regexp_extract before nth occurance hive 【发布时间】:2020-11-21 11:33:55 【问题描述】:

我有这样的字符串:

LLC1R.8888.GR0054656*DR.798012...2..............GR0054656*EUR*

我已经用这个进行了提取: REGEXP_EXTRACT(b.COLUMN_YY,'^([^\.]+)\.?',2)

但发生错误 2:mapredtask

    at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:157)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public java.lang.String org.apache.hadoop.hive.ql.udf.UDFRegExpExtract.evaluate(java.lang.String,java.lang.String,java.lang.Integer)  on object org.apache.hadoop.hive.ql.udf.UDFRegExpExtract@5875de6a of class org.apache.hadoop.hive.ql.udf.UDFRegExpExtract with arguments :java.lang.String, ^([^.]+).?:java.lang.String, 2:java.lang.Integer of size 3
    at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:1024)
    at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:194)
    at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186)
    at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77)
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.IndexOutOfBoundsException: No group 2

出了什么问题以及应该如何解决?

任何帮助/想法将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

从错误堆栈跟踪中很清楚出了什么问题:“Caused by: java.lang.IndexOutOfBoundsException: No group 2

REGEXP_EXTRACT reference:

返回使用模式提取的字符串。例如,regexp_extract('foothebar', 'foo(.*?)(bar)', 2) 返回'bar.' 请注意,在使用预定义的字符类时需要注意:使用'\s' 作为第二个参数将匹配字母s'\\s' 是匹配空格等所必需的。'index' 参数是 Java 正则表达式 Matcher group() 方法索引。有关“索引”或 Java 正则表达式 group() 方法的更多信息,请参阅 docs/api/java/util/regex/Matcher.html

因此,要获取. 之前的第一个子字符串,您应该使用

REGEXP_EXTRACT(b.COLUMN_YY, '^([^.]*)', 1)

要获取. 之间的第二个字符串,请使用

REGEXP_EXTRACT(b.COLUMN_YY, '^[^.]*\\.([^.]*)', 1)

要获取. 之间的第n 个字符串,请使用(?:[^.]*\.)n-1。因此,要获得第三个,请使用

REGEXP_EXTRACT(b.COLUMN_YY, '^(?:[^.]*\\.)2([^.]*)', 1)

请注意,1 index 参数使REGEXP_EXTRACT 返回在第 1 组中捕获的值,请参阅下面的模式详细信息:

^ - 字符串开头 (?:[^.]*\.)2 - 在这里,出现了两次 [^.]* - 除. 之外的 0 个或多个字符 \. - 一个 . 字符 ([^.]*) - 第 1 组:除 . 之外的任何 0 个或多个字符。

【讨论】:

以上是关于如何在第 n 次出现配置单元之前进行 regexp_extract的主要内容,如果未能解决你的问题,请参考以下文章

如何在第 n 次出现管道“|”后获取字符或字符串ORACLE 中使用 REGULAR_EXPRESSION 的符号?

最后一次总结正则表达式(RegExp)

在第 n 次出现字符时剪切字符串

regexp_extract 配置单元未按预期工作

RegExp -- 正则语法

PLSQL 在第 N 次和第 M 次出现字符之间选择 substr