悬空元字符 * sparksql

Posted

技术标签:

【中文标题】悬空元字符 * sparksql【英文标题】:Dangling metacharacter * sparksql 【发布时间】:2021-05-28 23:32:33 【问题描述】:

下面的正则表达式在 Hive 中有效,但在 Spark 中无效。

它会抛出一个错误dangling metacharacter * at index 3

select regexp_extract('a|b||c','^(\\|*(?:(?!\\|\\|\\w(?!\\|\\|)).)*)');

我也尝试用\\* 转义*,但它仍然抛出dangling metacharacter * at index 3

【问题讨论】:

试试'^(.*?)(?=\\|\\|\\w(?!\\|\\|)|$)' 嗨 @WiktorStribiżew,这篇文章与同一 OP 的 another post 相关,我在其中建议了一个使用 Tempered Greedy Token 的解决方案,其中 Negative Lookahead 嵌套在回火模式中。正则表达式通过了 regex101.com 中的测试用例,但在 Spark sql 中使用时不起作用。您在此处建议的修改与原始要求不匹配。您可以在那里查看并建议 OP 可以在 Spark sql 中使用它的方式。也欢迎对我的回答提出反建议! 好的,我建议在这里使用regexp_replace 方法:regexp_replace(col, '^(.*)[|]2.*$', '$1')。见this regex demo。 太棒了!这是一种基于底层语言语法而不是仅仅依赖于正则表达式的更简单的方法。优秀!这种语法摆脱了 \ 的使用,我认为这可能是以前的正则表达式在带回 Spark sql 时不起作用的原因。 @Wiktor-这在 Spark sql 中工作。感谢您的帮助。您能解释一下吗。我不明白替换部分。 【参考方案1】:

你可以使用

regexp_replace(col, '^(.*)[|]2.*$', '$1')

请参阅regex demo。

正则表达式详细信息

^ - 字符串开头 (.*) - Capturing group 1(此组值在替换模式中用$1 replacement backreference 引用):除换行符之外的任何零个或多个字符,尽可能多(行的其余部分) [|]2 - 双管(|| 字符串) .* - 该行的其余部分 $ - 字符串结束。

【讨论】:

以上是关于悬空元字符 * sparksql的主要内容,如果未能解决你的问题,请参考以下文章

标记化错误:java.util.regex.PatternSyntaxException,悬空元字符“*”

什么是正则表达式中的悬空元字符?

hiveql 上的正则表达式:悬空元字符映射减少 [重复]

在整数指针与字符指针的情况下悬空指针

在 sparksql 中将日期从字符串转换为日期

将字符串转换为日期 SparkSQL