在oracle中使用regexp_substr函数和非捕获组,将‘123-456-789'中所有的数字提取出来
时间: 2024-06-02 19:14:05 浏览: 154
可以使用以下语句:
SELECT REGEXP_SUBSTR('123-456-789', '\d+', 1, LEVEL) AS NUMBERS
FROM DUAL
CONNECT BY REGEXP_SUBSTR('123-456-789', '\d+', 1, LEVEL) IS NOT NULL;
解释一下:
- REGEXP_SUBSTR('123-456-789', '\d+', 1, LEVEL) 表示在字符串 '123-456-789' 中匹配连续的数字,返回第 LEVEL 个匹配的结果。
- '\d+' 表示匹配一个或多个数字。
- LEVEL 表示一个伪列,从 1 开始依次递增。CONNECT BY 表示以 LEVEL 为基础生成行。
- IS NOT NULL 表示只要匹配结果不为空,就继续生成行。
这样就可以将字符串中所有的数字提取出来了。
相关问题
oracle regexp_substr 函数中括号的使用方式
Oracle REGEXP_SUBSTR函数中括号的使用方式如下:
1. 捕获组:可以使用括号来定义一个捕获组,以便在正则表达式中引用该组。例如,"(ab)+c"表示一个或多个连续的"ab"后面跟着一个"c"。
2. 非捕获组:如果不需要引用该组,可以使用非捕获组。非捕获组的语法为"(?:pattern)"。例如,"(?:ab)+c"表示一个或多个连续的"ab"后面跟着一个"c",但是不会将"ab"捕获到分组中。
3. 否定预测先行断言:可以使用"(?!pattern)"来定义否定预测先行断言。例如,"(?!ab)c"表示在"c"前面不应该有"ab"。
4. 肯定预测先行断言:可以使用"(?=pattern)"来定义肯定预测先行断言。例如,"(?=ab)c"表示在"c"前面应该有"ab"。
5. 否定回溯引用:可以使用"(?<!pattern)"来定义否定回溯引用。例如,"(?<!ab)c"表示在"c"前面不应该有"ab"。
6. 肯定回溯引用:可以使用"(?<=pattern)"来定义肯定回溯引用。例如,"(?<=ab)c"表示在"c"前面应该有"ab"。
regexp_substr拆分天几小时几分
`REGEXP_SUBSTR` 是一种正则表达式函数,主要用于从字符串中提取满足模式的部分。在 Oracle 数据库中,如果你想通过这个函数来拆分时间,比如 "天 HH 小时 MI 分" 的格式,通常需要先定义一个匹配模式,然后使用它来截取所需的时间部分。
假设你有一个字符串 `time_string` 形如 "3天 8小时 45分钟",你可以尝试这样的步骤:
```sql
WITH time_data AS (
SELECT '3天 8小时 45分钟' as time_string
)
SELECT REGEXP_SUBSTR(time_string, '^(.*?)(天|小时|分钟)', 1, 1, '\1') as days,
REGEXP_SUBSTR(time_string, '^(.*?)(天|小时|分钟)', 1, 2, '\1') as hours,
REGEXP_SUBSTR(time_string, '^(.*?)(天|小时|分钟)', 1, 3, '\1') as minutes
FROM time_data;
```
在这个例子中,`'(.*?)(天|小时|分钟)'` 是匹配模式,`\1` 是捕获组的结果,用于提取每个时间单位前面的具体数值。但是请注意,这个例子假设输入总是按照固定的格式,如果输入格式有变化,你可能需要调整正则表达式以适应实际情况。
阅读全文