regexp_extract适用于多种模式吗?-Spark sql

2024-04-19

模式 1:由 | 分隔

Input : a|b|c|d     
Output: a|b|c|d 

当用单个管道分隔时选择所有内容

模式 2:由 | 分隔和||
示例1:

Input :a|b||c||d       
Output:a|b||c   

选择最后一个双管之前的所有内容

示例2:

Input :a|b||c|d     
Output:a|b   

模式3:字符串的开头可以有多个管道(奇数或偶数),并进一步由 | 分隔和||

Input :|||a|b||c||d     
Output:|||a|b||c 

选择最后一个双管之前的所有内容,字符串的开头可能有奇数或偶数管道,必须选择它们。

下面涵盖了除场景1之外的所有场景,我的要求是在一个场景中涵盖所有场景regexp_extract spark.sql("select regexp_extract('name|place|thing|ink', '(.*)(?=\\\\|\\\\|)') as demo").show(false)

如果不能在一个 regexp_extract 中完成。您可以建议其他选项吗?

请指教。


使用以下正则表达式:

^(\|*(?:(?!\|\|(?!.*\|\|)).)*)

See the 正则表达式演示 https://regex101.com/r/EolcHu/1/显示所有比赛

这是一个相当复杂的要求,需要使用淬炼的贪婪令牌 https://stackoverflow.com/a/37343088/15070697与 Tempering 模式中的 Negative Lookahead 一起使用。让我解释一下以下逻辑:

Logics

  • ^仅从字符串的开头匹配
  • (...)之后将整个图案括起来^使其成为一个捕获组
  • \|*对于模式3的要求,匹配倍数|一开始,尽可能多(因此使用贪婪*)
  • (?:(?!...).)*这是 Tempered Greedy Token 的主要构造(骨架),我将在下面解释其详细信息:
  • \|\|(?!.*\|\|)这是贪婪淬炼令的主体(核心)。第一部分之前(是为了确保字符匹配但不包括模式||第二部分(?!.*\|\|)是为了确保||第一部分中的模式后面没有任何其他双管||根据要求,在之后的某个地方。

事实上,我认为这个问题很有趣,需要 RegEx 的复杂功能来支持它。这也是我迄今为止看到的第一个需要在 Tempered Greedy Token 构造中使用 Negative Lookahead 的示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

regexp_extract适用于多种模式吗?-Spark sql 的相关文章

随机推荐