正则表达式在第二个下划线和最后一个下划线之间获取字符串
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 以外的任何零个或多个字符=]尽可能多,不允许回溯到[^_]*+
模式。
我想获取字符串中第二个下划线和最后一个下划线之间的所有字符,请问如何实现。 我将在 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 以外的任何零个或多个字符=]尽可能多,不允许回溯到[^_]*+
模式。