【问题标题】:Dangling metacharacter * sparksql悬空元字符 * 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 中工作。感谢您的帮助。您能解释一下吗。我不明白替换部分。

标签: regex apache-spark regex-group regexp-replace metacharacters


【解决方案1】:

你可以使用

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

请参阅regex demo

正则表达式详细信息

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

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多