Oracle截取子字符串:如何提取日期连字符前内容?是否用正则?
如何从包含日期的字符串中提取连字符前的目标内容?
当然可以实现!不管是用简单的字符串截取方法,还是灵活的正则表达式都能搞定,下面给你几种实用的方案:
方案一:字符串截取法(适合格式固定的场景)
如果你的字符串格式完全固定,比如都是「目标内容-日期时间」的结构(就像你给出的TEST-01-2019/10/10 01:01:20),那么直接找第二个连字符的位置,截取前面的内容就很高效。
举个Python的例子:
s = "TEST-01-2019/10/10 01:01:20" # 先找到第一个连字符的位置,再从它的下一位找第二个连字符 second_dash_pos = s.index('-', s.index('-') + 1) result = s[:second_dash_pos] print(result) # 输出:TEST-01
如果是在SQL场景(比如MySQL),还可以用内置的SUBSTRING_INDEX函数,一步到位:
SELECT SUBSTRING_INDEX('TEST-01-2019/10/10 01:01:20', '-', 2) AS target_content;
这个函数会按-分割字符串,取前2个部分,直接返回TEST-01。
方案二:正则表达式法(适合格式有变化的场景)
如果你的字符串格式偶尔有小变动(比如目标内容里可能有特殊字符,但日期部分始终是「数字/数字/数字」的格式),正则表达式会更灵活。
核心思路是:匹配字符串开头到「日期前的连字符」之间的内容。举个Python的实现例子:
import re s = "TEST-01-2019/10/10 01:01:20" # 正则捕获组:匹配开头到"-年份"之前的内容 match_result = re.match(r'^(.+?)-\d{4}/', s) if match_result: target_content = match_result.group(1) print(target_content) # 输出:TEST-01
这里的正则^(.+?)-\d{4}/含义是:
^:匹配字符串的开头(.+?):非贪婪匹配任意字符,把这部分捕获为我们要的目标内容-\d{4}/:匹配「连字符+4位数字+斜杠」(对应日期里的-2019/),以此作为结束标记
这种方法哪怕目标内容里有其他特殊字符,只要日期部分的格式不变,都能准确提取。
内容的提问来源于stack exchange,提问作者sqlpractice
相关产品推荐
相关产品推荐

