我有以下字符串
'HOLA1_HOLA2_HOLA3_HOLA4' 'HOLA1_HOLA2_HOLA3_HOLA4_HOLA5'
我怎样才能得到字符串中第二个到最后一个出现的“_”字符的部分?预期结果:
'HOLA1_HOLA2' 'HOLA1_HOLA2_HOLA3'
qqrboqgw1#
使用简单(快速)的字符串函数,查找子字符串直到倒数第二个下划线(而不是使用(缓慢)的正则表达式):
SELECT SUBSTR(value, 1, INSTR(value, '_', -1, 2) - 1) AS first_part FROM table_name;
其中,对于示例数据:
CREATE TABLE table_name (value) AS SELECT 'HOLA1_HOLA2_HOLA3_HOLA4' FROM DUAL UNION ALL SELECT 'HOLA1_HOLA2_HOLA3_HOLA4_HOLA5' FROM DUAL;
输出:| 第一部分|| - ------|| 全息图1_全息图2|| 全息图1_全息图2_全息图3|fiddle
ruarlubt2#
关于具有此行为的正则表达式:您可以使用预视来获得预期的结果.*(?=_)lookahead是一个零长度Assert(不包括在match中),Assert一个match必须跟在给定的表达式后面(在本例中为_)。默认情况下,regex执行贪婪匹配,因此lookahead的目标是给定文本中的最后一个下划线。regex101
.*(?=_)
_
2条答案
按热度按时间qqrboqgw1#
使用简单(快速)的字符串函数,查找子字符串直到倒数第二个下划线(而不是使用(缓慢)的正则表达式):
其中,对于示例数据:
输出:
| 第一部分|
| - ------|
| 全息图1_全息图2|
| 全息图1_全息图2_全息图3|
fiddle
ruarlubt2#
关于具有此行为的正则表达式:您可以使用预视来获得预期的结果
.*(?=_)
lookahead是一个零长度Assert(不包括在match中),Assert一个match必须跟在给定的表达式后面(在本例中为
_
)。默认情况下,regex执行贪婪匹配,因此lookahead的目标是给定文本中的最后一个下划线。regex101