模式 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(使用前将#替换为@)