正则表达式在第二个下划线和最后一个下划线之间获取字符串

regex to get String between second underscore and last underscore

我想获取字符串中第二个下划线和最后一个下划线之间的所有字符,请问如何实现。 我将在 spark.

的 regex_extract 函数中使用这个正则表达式
Examples
Input                                                                                       Output                     
Problem_ISOAPAPattern_Pat_2nd_byUser-withAllRoles_351107b7-88eb-4232-9107-b788eb92325b    Pat_2nd_byUser-withAllRoles     

Problem_ISOACompressionPattern_pattern 7cbc_7cbce13c-0b25-49a4-bce1-3c0b2569a411          pattern 7cbc 
//doing spark code to extract
spark.sql("select regexp_extract(values, '^(?:[^_]+_){2}([^_ ]+)', 1) pname from san2").show(false)

演示 URL:https://regex101.com/r/BipSW8/1

知道正则表达式应该是什么样子

您可以使用

^(?:[^_]+_){2}(.+)_
^(?:[^_]*_){2}([^_]*(?:_[^_]*+)*)_

第二个正则表达式等于

^(?:[^_]*_){2}([^_]*(?>_[^_]*)*)_

参见 regex #1 demo and regex #2 demo。第二个比第一个更有效率,因为它不允许太多回溯。

第一个正则表达式使用 (.+)_,一个贪婪的点模式首先抓取整行,然后回溯开始发挥作用,使正则表达式引擎沿着字符串后退,逐个字符地找到最右边出现的_然后给出结果

第二个正则表达式匹配 _ 以外的字符(使用 [^_]*),然后匹配零个或多个 _ 序列,然后匹配 [=13 以外的任何零个或多个字符=]尽可能多,不允许回溯到[^_]*+模式。